RelativeSource实例

Binding中使用RelativeSource

问题:当前View有一个DataGrid,其DataGridTemplateColum设置了一个ComboBox。

其对应的VM是local:ViewMode,含有ModelValuemyLIst属性分别用来做DataGrid的ItemSource,和ComboBox的ItemSource外层内层看起来链接的VM层不同的property。

初始代码如下:

<DataGrid ItemsSource="{Binding ModelValues, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" >

       <DataGridTemplateColumn Header="myHeader" Width="200">

            <DataGridTemplateColumn.CellTemplate>

                 <DataTemplate>

                      <ComboBox DisplayMemberPath="Value" SelectedValuePath="Key" IsEnabled="False"

                           SelectedValue="{Binding myID, Mode=TwoWay}"

                           ItemsSource="{Binding Path=myList, 

                           RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:ViewModel}}}" />

                 </DataTemplate>

            </DataGridTemplateColumn.CellTemplate>

            <DataGridTemplateColumn.CellEditingTemplate>

                 <DataTemplate>

                      <ComboBox DisplayMemberPath="Value" SelectedValuePath="Key" IsEnabled="False"

                           SelectedValue="{Binding myID, Mode=TwoWay}"

                           ItemsSource="{Binding Path=myList, 

                           RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:ViewModel}}}" />

                 </DataTemplate>

            </DataGridTemplateColumn.CellEditingTemplate>

       </DataGridTemplateColumn>

  </DataGrid>



View Code
View Code

错误在于RelativeSource沿着Visual Tree找不到一个叫local:ViewModel的图形对象

RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:ViewModel}}

 

解决代码:The Relativesource is for the Visual Tree, not the DataContext

<DataGrid ItemsSource="{Binding ModelValues, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" >

  <DataGridTemplateColumn Header="myHeader" Width="200">

     <DataGridTemplateColumn.CellTemplate>

        <DataTemplate>

            <ComboBox DisplayMemberPath="Value" SelectedValuePath="Key" IsEnabled="False"

                      SelectedValue="{Binding myID, Mode=TwoWay}"

                      ItemsSource="{Binding Path=DataContext.myList, 

                      RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}" />

        </DataTemplate>

    </DataGridTemplateColumn.CellTemplate>

    <DataGridTemplateColumn.CellEditingTemplate>

        <DataTemplate>

            <ComboBox DisplayMemberPath="Value" SelectedValuePath="Key" IsEnabled="False"

                      SelectedValue="{Binding myID, Mode=TwoWay}"

                      ItemsSource="{Binding Path=DataContext.myList, 

                      RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}" />

        </DataTemplate>

    </DataGridTemplateColumn.CellEditingTemplate>

  </DataGridTemplateColumn>

</DataGrid>
View Code

 

 

你可能感兴趣的:(relative)