将控制绑定到两个属性

时间:2015-06-16 10:04:31

标签: wpf binding

使用MVVM模式和WPF,我想将我的控件绑定到两个属性。假设我有一个绑定到VM1上的属性的标签,我想将它绑定到VM2上的属性,以便将接收到的值从VM1发送到VM2。

我可以使用messenger和多个项目Tuple Class,但我想知道是否有另一个解决方案。 Multibinding?但后来我需要ValueConverter。

感谢您提出任何建议。

2 个答案:

答案 0 :(得分:1)

如果连接了2个属性,通常可以使用INotifyPropertyChanged来通知在同一个ViewModel上有2个或更多属性的更改。

据我所知,您还希望通知附加到ViewModel的View,了解另一个ViewModel上属性的更改。这通常是通过让ViewModels交换信息来完成的。

如果这是一种罕见的情况,那么使用消息总线可能是一种过度杀伤力。通常保持对每个视图模型的引用并从外部更改属性应该是正确的。为了保持关注点的分离,您可以在一个或两个视图模型上创建一个接口,并引用此接口而不是具体类型。

整体上保持控件和属性之间的单一绑定使其简单易懂,您应该担心确保此属性处理与其他VM的所有更改。

答案 1 :(得分:1)

因为 View-Model是公开属性和命令的视图的抽象,所以对于一个视图来说有两个视图模型的方式并不是很有意义你解释道。如果有VM类作为视图的视图模型,它具有VM1VM2类型的两个属性,那么它会更加理性。然后绑定将在VM.VM1.YourText上,您可以通过以下事件通知VM2

VM1中的

    public event EventHandler<EventArgs> ValueChanged;

    string _yourText;
    public string YourText
    {
        get
        {
            return _yourText;
        }
        set
        {
            _yourText= value;
            if (ValueChanged != null)
                ValueChanged(_yourText, new EventArgs());
        }
    }

在VM中:

    public VM1 Vm1 {get; set;}
    public VM2 Vm2 {get; set;}

    public VM()
    {
        InitializeComponent();
        Vm1 = new VM1();
        Vm2 = new VM2();
        Vm1.ValueChanged += Item_ValueChanged;
        DataContext = this;
    }

    void Item_ValueChanged(object sender, EventArgs e)
    {
        VM2.YourAnotherText = sender.ToString();
    }