RelativeSource实例
Binding中使用RelativeSource
问题:当前View有一个DataGrid,其DataGridTemplateColum设置了一个ComboBox。
其对应的VM是local:ViewMode,含有ModelValue和myLIst属性分别用来做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
错误在于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>