Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 简单用户控制和MVVM模式:如何使用?_C#_Wpf_Xaml_Mvvm_User Controls - Fatal编程技术网

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,但在本例中不是这样。