将控件绑定到两个属性

Bind Control to Two properties

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

我可以使用 Messenger 和多个项目元组 Class,但我想知道是否有其他解决方案。多重绑定?但是我需要 ValueConverter。

感谢您的任何建议。

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

据我了解,您还想通知附加到 ViewModel 的视图关于另一个 ViewModel 上 属性 的更改。这通常是通过让 ViewModel 交换信息来完成的。

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

总的来说,在控件和 属性 之间保持单一绑定使其简单易懂,您应该担心确保此 属性 处理所有更改 to/from 其他 VM .

由于 View-Model 是公开 public 属性和命令的视图的抽象,因此视图没有多大意义按照您解释的方式有两个视图模型。如果有一个 VM class 作为视图的视图模型,它会更合理,它具有类型 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());
        }
    }

虚拟机中:

    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();
    }