C# 简单用户控制和MVVM模式:如何使用?
请帮帮我 我有C# 简单用户控制和MVVM模式:如何使用?,c#,wpf,xaml,mvvm,user-controls,C#,Wpf,Xaml,Mvvm,User Controls,请帮帮我 我有 public partial class OrderControl : UserControl { private OrderHeader orderHeader; public Customer selectedCustomer { get; set; } private Customer[] allCustomers; public User selectedManager { get; set; } private User[] al
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的实例
谢谢最好创建一个ViewModel类,将您的属性移动到该类,并使其成为
用户控件的DataContext
另外,您的selectedCustomer
属性只是一个常规的.NET属性,它需要支持INotifyPropertyChanged接口,以方便绑定和更改通知。。。通常,一个基本的ViewModel
类(您的所有其他ViewModel
类都从该类继承)将实现此接口…,如果您实现INotifyPropertyChanged,该接口将起作用。现在,在设置属性时,组合框无法获得更新。看
但是,如果希望遵循MVVM,则需要创建视图模型对象。如果要创建真正的用户控件,则不应:
DataContext = this;
这里引用H.B
这样设置DataContext是不可见的,这是一种不好的做法
“从外部”作为DataContext的继承是不切实际的
通常是你想要和期望的
是类似的问题和答案
但是如果你想先用viewmodel做MVVM
引用雷切尔的话:
记住,使用MVVM,您的视图模型就是您的
应用视图只是一个漂亮的界面,允许用户
与ViewModels交互
这意味着您应该使用所需的所有属性和命令创建适当的ViewModel。从usercontrol中删除所有代码,因为它现在只是一个视图。viewmodel首先通过datatemplates连接viewmodel和视图。该属性不能是DependencyProperty。如果他将其放在viewmodel中,以这种方式将其绑定到他的组合框,则可以。他需要实现的是InotifyProperty更改以提供通知。@马克,你说得对,它不需要是DP。。。通常,ViewModel基类实现INotifyPropertyChanged…但如果将UsersControl的ViewModel分配给其自己的DataContext,则会中断组成UserControl的父控件中的绑定。具体来说,在所属父控件中进行的绑定随后将解析为UserControl自己的viewmodel,而不是父控件的viewmodel,这是意外的,需要混乱的解决方法。@Neutrino您错了,父级有自己的VM和一个UC,它的DataContext是另一个VM绝对不会干扰它…如果UserControl绑定了自己的DataContext,它确实会干扰父级的绑定,这也让我大吃一惊。为什么OP需要实现INotifyPropertyChanged,因为OP想要的只是到源的单向绑定。我同意,如果OP想要单向或双向绑定,则必须实现INotifyPropertyChanged,但在本例中不是这样。