我有两个DataGrids填充了相同类型的对象的单独集合。在我的ViewModel中,我有一个属性“CurrentObject”,我想绑定到当前选定的对象。
这意味着如果我在DataGrid A中选择一行,则CurrentObject保存所选的DataGrid A项,如果我在DataGrid B中选择一行,则CurrentObject保存所选的DataGrid B项。
在两个DataGrids中我都完成了这样的绑定:
<DataGrid SelectedItem="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.CurrentObject}">
当我在一个DataGrid中更改选择时,它只能按预期工作。如果我选择已选择的行,则不更新CurrentObject属性,仍然从其他DataGrid引用该对象。我想是因为SelectionChanged事件没有被触发
答案 0 :(得分:2)
在DataGrid的LostFocus事件中清除SelectedItem:
示例:
private void dg1_LostFocus(object sender, RoutedEventArgs e)
{
dg1.SelectedItem = null;
}
private void dg2_LostFocus(object sender, RoutedEventArgs e)
{
dg2.SelectedItem = null;
}
因为如果你在DataGrid lostfocus时没有清除SelectedItem,DataGrid仍然会记住SelectedItem,如果你再次选择这个项,则不会触发SelectionChanged事件。
mvvm例子:
public void dg1_LostFocus(object sender, RoutedEventArgs e)
{
DataGrid dg = sender as DataGrid;
if(dg != null)
{
dg.SelectedItem = null;
}
}
<i:Interaction.Triggers>
<i:EventTrigger EventName="LostFocus">
<ei:CallMethodAction MethodName="dg1_LostFocus" TargetObject="{Binding}" />
</i:EventTrigger>
</i:Interaction.Triggers>
答案 1 :(得分:0)
我无法清楚地判断您是使用事件还是绑定,但我认为您是以绑定方式进行的。在这种情况下,请尝试将IsSynchronizedWithCurrentItem
设置为true。更多信息here
答案 2 :(得分:0)
<iy:Interaction.Triggers>
<iy:EventTrigger EventName="GotFocus">
<is:ChangePropertyAction TargetObject="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext}"
PropertyName="CurrentObject"
Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=SelectedValue}" />
</iy:EventTrigger>
</iy:Interaction.Triggers>
由于仅在单个控件中更改选择时更新Binding,因此我还在DataGrid获得焦点时更改属性