【问题标题】:Sharing non control related data between WPF ViewModel and UserControl在 WPF ViewModel 和 UserControl 之间共享非控件相关数据
【发布时间】:2011-09-01 12:19:46
【问题描述】:

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

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

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

我需要共享不会由用户控件上的控件表示的数据。有没有一种很好的方法来传递这些数据(复杂的 Order 对象)?也许我确实需要在我的用户控件上使用某种隐藏控件来完成此操作,但我只是不确定是否是新手。任何建议将不胜感激。

【问题讨论】:

  • 你能举个例子吗? “我需要共享不会由用户控件上的控件表示的数据”令人困惑...
  • @Tigran 我认为他的意思是不会显示的东西,例如,如果您有一个带有正则表达式的验证用户控件,您将不会显示正则表达式,但您可能会从视图中获得它模型。虽然我同意这并不完全清楚。
  • @Tuskan360,是的,这就是我的意思。我的视图模型中有一个 Order 对象,我将使用它在我的用户控件中填充 Viewport3D 对象。我的订单对象只是从我的视图模型传递到我的用户控件的数据,但没有直接显示在我的用户控件中。我看到的大多数像这样共享数据的例子都是文本框或类似的东西。这就是为什么我说我的数据不会由用户控件上的控件表示。
  • @Cole 澄清了很多事情,下面的答案有帮助还是还有不清楚的地方?

标签: c# wpf mvvm


【解决方案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.
        }
    }

在您使用用户控件的父视图中,您可以编写如下内容:

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

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

【讨论】:

  • +1 很好的清晰解释。感谢您为我解决这个问题。现在完全有道理。现在可以了!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2019-07-02
    • 1970-01-01
    • 2011-07-22
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    相关资源
    最近更新 更多