微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 焦点更改时更改绑定

我有一个具有多个树视图和一个propertygrid的应用程序(来自扩展的 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.

亲切的问候,
杰夫

解决方法

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

每个树视图都绑定到主视图模型上的viemodel属性.我还在主视图模型上创建了一个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;
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐