【问题标题】:Change binding when focus changes焦点更改时更改绑定
【发布时间】:2016-01-21 18:02:02
【问题描述】:

我有一个应用程序,它有几个树视图和一个属性网格(来自扩展的 WPF 工具包)。目标是显示所选项目的属性。我对 WPF 很陌生,所以我从一个树视图开始,并像这样绑定 propertygrids 选定的对象

<xctk:PropertyGrid x:Name="xctkPropertyGrid"
                       Grid.Column="2"
                       ShowSearchBox="False"
                       ShowSortOptions="False"
                       SelectedObject="{Binding ElementName=actionsTreeView, Path=SelectedItem, Mode=OneWay}">
</xctk:PropertyGrid>

这似乎工作正常。但它总是与actionsTreeView 绑定。当焦点更改为另一个树视图中的另一个选定项时,我真正需要的是更新该属性网格。我已经使用每个树视图的SelectedItemChanged 实现了我的目标,并像这样设置 propertygrids selectedobject。这是否可以使用数据绑定和触发器以某种方式实现。我的解决方案在后面添加了一些代码和紧密耦合,感觉不是很 MVVM。

亲切的问候, 杰夫

【问题讨论】:

  • 我很想看到一个例子,说明即使只有一棵树,你也能做到这一点。您是否有机会发布更多代码,包括actionsTreeView 和相应的视图模型?
  • 对不起。我手头没有那个代码了。但我敢肯定,正如下面的答案中所解释的那样。

标签: c# wpf xaml


【解决方案1】:

好的,这就是我最终解决问题的方法:

每个树视图都绑定到主视图模型上的视图模型属性。我还在主视图模型上创建了一个 SelectedItem 属性,如下所示,propertygrid 的 SelectedObject 绑定到该属性:

private object selectedItem;
public object SelectedItem
{
    get { return selectedItem; }
    set
    {
        selectedItem = value;
        OnPropertyChanged("SelectedItem");
    }
}

然后我将一个行为附加到更新此 SelectedItem 的每个树视图:

public class UpdateSelectedItemBehavior : Behavior<TreeView>
{
    protected override void OnAttached()
    {
        base.OnAttached();

        this.AssociatedObject.GotFocus += AssociatedObject_GotFocus;
        this.AssociatedObject.SelectedItemChanged += AssociatedObject_SelectedItemChanged;
    }

    void AssociatedObject_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        ViewModels.MainViewModel mainViewModel = AssociatedObject.DataContext as ViewModels.MainViewModel;
        if (mainViewModel != null)
        {
            mainViewModel.SelectedItem = AssociatedObject.SelectedItem;
        }
    }

    void AssociatedObject_GotFocus(object sender, RoutedEventArgs e)
    {
        ViewModels.MainViewModel mainViewModel = AssociatedObject.DataContext as ViewModels.MainViewModel;
        if (mainViewModel != null)
        {
            mainViewModel.SelectedItem = AssociatedObject.SelectedItem;
        }
    }
}

【讨论】:

    猜你喜欢
    • 2011-09-07
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 2011-01-07
    • 2021-05-13
    相关资源
    最近更新 更多