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

时间:2011-09-01 12:19:47

标签: c# wpf mvvm

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

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

看起来UserControl确实已经通过DependencyPropertys在视图模型之间共享数据,但是这个数据只是用户控件上的文本框,它们看起来被绑定到视图模型上的propertys。

我需要共享不会由用户控件上的控件表示的数据。是否有传递此数据的好方法(复杂的Order对象)?也许我确实需要对我的用户控件进行某种隐藏控制来实现这一目标,但我不确定是否对此不熟悉。任何建议将不胜感激。

2 个答案:

答案 0 :(得分:1)

不需要隐藏字段(或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的dependancy属性,ViewModelOrder是视图模型中属性的名称,您需要将local:MyUserControl替换为您的控件名称/命名空间。

答案 1 :(得分:1)

您可以在UserControl的类中创建依赖项属性,并在使用该控件的View中绑定它。无需在内部将依赖项属性绑定到UserControl中的一个控件。