如何将单个属性绑定到WPF中两个控件的选择?

时间:2014-09-03 05:31:50

标签: wpf wpfdatagrid

我有两个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事件没有被触发

3 个答案:

答案 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)

Rang还有使用交互触发器来避免代码落后的想法。看起来我们同时有同样的想法。他的方法是在额外的视图模型方法中处理LostFocus事件,我的是用绑定来处理GotFocus。我认为这是个人偏好的方向。为了完整起见:

<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获得焦点时更改属性