焦点更改时更改绑定

时间:2016-01-07 09:41:05

标签: c# wpf xaml

我有一个具有多个树视图和一个propertygrid的应用程序(来自扩展的WPF工具包)。目标是显示所选项目的属性。我是WPF的新手,所以我开始使用一个树视图并绑定像这样的属性选择对象

<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。

亲切的问候, 杰夫

1 个答案:

答案 0 :(得分:1)

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

每个树视图都绑定到主视图模型上的viemodel属性。我还在主视图模型上创建了一个SelectedItem属性,类似于属性网格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;
        }
    }
}
相关问题