【问题标题】:Simple usercontrol and MVVM pattern: How to use?简单的用户控件和 MVVM 模式:如何使用?
【发布时间】:2012-07-19 17:57:55
【问题描述】:

请帮帮我

我有

public partial class OrderControl : UserControl
{
    private OrderHeader orderHeader;
    public Customer selectedCustomer { get; set; }
    private Customer[] allCustomers;
    public User selectedManager { get; set; }
    private User[] allManagers;


    public OrderControl()
    {
        InitializeComponent();
        DataContext = this;
    }
...
}

我需要一种绑定到源的方式:

<ComboBox Name="CustomerComboBox" SelectedItem="{Binding selectedCustomer}"/>

这是将 selectedCustomer 属性保留在 OrderControl.xaml.cs 中的最佳方式,还是我需要使用 ..,selectedCustomer,... 属性创建一些 OrderViewModel 类并在 OrderControl.xaml.cs 中保留 OrderViewModel 的实例?

谢谢

【问题讨论】:

    标签: c# wpf xaml mvvm user-controls


    【解决方案1】:

    如果您实施 INotifyPropertyChanged,这将起作用。现在,组合框无法在设置属性时获取更新。见http://msdn.microsoft.com/en-us/library/ms229614.aspx

    但是,如果您希望遵循 MVVM,那么您将需要创建一个视图模型对象。

    【讨论】:

    • 为什么 OP 需要实现 INotifyPropertyChanged,因为所有 OP 想要的是单向绑定到源。我同意,如果 OP 想要 OneWay 或 TwoWay 绑定,则必须实现 INotifyPropertyChanged,但在这种情况下不需要。
    【解决方案2】:

    最好创建一个 ViewModel 类,将您的属性移动到该类并使其成为您的UserControlDataContext

    此外,您的 selectedCustomer 属性只是一个常规的 .NET 属性,它需要支持 INotifyPropertyChanged 接口以促进绑定和更改通知...通常是一个基础 ViewModel 类,所有其他 ViewModel 都来自该类类继承会实现这个接口...

    【讨论】:

    • 属性不能是 DependencyProperty,如果他把它放在 ViewModel 中以这种方式绑定到他的 ComboBox 就可以了。他需要实现的是 INotifyPropertyChanged 来提供通知。
    • @Mark,你说得对,它不需要是 DP...通常 ViewModel 基类实现 INotifyPropertyChanged...
    • 但是,如果您将 UsersControl 的视图模型分配给它自己的 DataContext,那么这会破坏在组成 UserControl 的父控件中进行的绑定。具体而言,在拥有父控件中进行的绑定将解析为 UserControl 自己的视图模型,而不是父视图模型,这是意料之外的,需要一些混乱的解决方法。
    • @Neutrino 你错了,父级有自己的虚拟机和一个其 DataContext 是其他虚拟机的 UC 绝不会干扰...
    • 如果 UserControl 绑定了它自己的 DataContext,它确实会干扰父级的绑定 stackoverflow.com/questions/12819044/…,这也让我大吃一惊。
    【解决方案3】:

    如果你想创建真正的用户控件,你不应该这样做:

     DataContext = this;
    

    这里引用 H.B. 的一句话

    这是不好的做法,这样设置 DataContext 是不可见的 “从外部”并且作为 DataContext 的继承是不切实际的 通常是您想要和期望的

    here 是类似的问答。

    但是如果你想先用 viewmodel 做 MVVM。

    引用瑞秋的话:

    请记住,使用 MVVM,您的 ViewModel 就是您的 应用。视图只是一个漂亮的界面,允许用户 与您的 ViewModel 交互。

    这意味着您应该使用所需的所有属性和命令创建适当的视图模型。从您的用户控件中删除所有代码,因为它现在只是一个视图。 viewmodel首先通过datatemplates连接viewmodel和view。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-14
      • 2011-03-21
      • 2010-10-31
      • 2011-10-14
      • 1970-01-01
      • 1970-01-01
      • 2012-10-10
      • 1970-01-01
      相关资源
      最近更新 更多