在WPF ViewModel和UserControl之间共享非控件相关的数据

本文关键字:控件 数据 共享 ViewModel WPF UserControl 之间 | 更新日期: 2023-09-27 18:07:10

我是WPF和MVVM模式的新手,所以请记住这一点。

我负责的项目有一个视图和一个视图模型。视图还包含一个没有视图模型的用户控件。有数据(自定义对象…Order)被传递给我还需要与用户控件共享的视图模型。

看起来UserControl确实通过DependencyPropertys在视图模型之间共享数据,但这些数据只是用户控件上的文本框,看起来要绑定回视图模型上的属性。

我需要在用户控件上共享不会由控件表示的数据。是否有一个好的方法来传递这个数据(复杂的订单对象)?也许我确实需要在用户控件上隐藏一些控件来完成这个,但我不太确定,因为我是新手。如有任何建议,不胜感激。

在WPF ViewModel和UserControl之间共享非控件相关的数据

不需要隐藏字段(或WPF中的任何此类概念),因为您可以向用户控件添加任何自定义属性。

在用户控件中,像这样创建一个新的依赖属性,但是MyUserControl设置得当:

    public Order CurrentOrder
    {
        get { return (Order)GetValue(CurrentOrderProperty); }
        set { SetValue(CurrentOrderProperty, value); }
    }
    // Using a DependencyProperty as the backing store for CurrentOrder.  This enables binding, etc.
    public static readonly DependencyProperty CurrentOrderProperty =
        DependencyProperty.Register("CurrentOrder", typeof(Order), typeof(MyUserControl), new PropertyMetadata(null, OnCurrentOrderPropertyChanged));
    public static void OnCurrentOrderPropertyChanged(DependencyObject Sender, DependencyPropertyChangedEventArgs e)
    {
        var sender = Sender as MyUserControl;
        var NewValue = e.NewValue as Order;
        var OldValue = e.OldValue as Order;
        if (OldValue != null && sender != null)
        {
            //Use old value as needed and use sender instead of this as method is static.
        }
        if (NewValue != null && sender != null)
        {
            //Use new value as needed and use sender instead of this as method is static.
        }
    }

在你使用usercontrol的父视图中,你可以这样写:

<local:MyUserControl CurrentOrder="{Binding ViewModelOrder}" />

其中CurrentOrder是usercontrol的依赖属性,ViewModelOrder是视图模型中属性的名称,您需要将local:MyUserControl替换为您的控件名称/命名空间

你可以简单地在UserControl的类中创建一个依赖属性,并在使用该控件的视图中绑定到它。不需要在内部将依赖属性绑定到UserControl中的某个控件。