将主窗口上的用户控件视图模型与 MVVM 绑定

本文关键字:模型 视图 MVVM 绑定 控件 用户 窗口 | 更新日期: 2023-09-27 18:34:30

我是WPF和MVVM的新手,我正在尝试学习WPF如何使用MVVM。 为此,我制作了一个示例,如下所示

用户控制1.xaml

<StackPanel>
        <TextBox   Text="{Binding MyString}" />
</StackPanel>

用户控件1视图模型.cs

class UserControl1ViewModel
{
     public string MyString { get; set; }
}

MainWindow.xaml

<StackPanel>
        <local:UserControl1 DataContext="{Binding UC1Property}"/>  //tried binding the Usercontrol1VM obj on MainWindowVM
        <Button Command="{Binding ShowMeOne}" Height="30" Content="ShowOne"/>
        <Button Command="{Binding ShowMeAnother}" Height="30" Content="ShowAnother" />
</StackPanel>

MainWindow.xaml.cs

public MainWindow()
{
   InitializeComponent();
   this.DataContext = new MainWindowViewModel();
}

主窗口视图模型.cs

class MainWindowViewModel
{
    public MainWindowViewModel()
    {
        ShowMeOne = new RelayCommand(Prompt_ShowMeOne);
        ShowMeAnother = new RelayCommand(Prompt_ShowMeAnother);
        UC1Property.MyString = "Initial";
    }
    private void Prompt_ShowMeAnother(object obj)
    {
        global::System.Windows.MessageBox.Show("Another Should be shown");     
        UC1Property.MyString = "Last Clicked:  Another";
    }
    private void Prompt_ShowMeOne(object obj)
    {
        global::System.Windows.MessageBox.Show("One Should be shown");
        UC1Property.MyString = "Last Clicked:  One";
    }
    public ICommand ShowMeOne { get; set; }
    public ICommand ShowMeAnother { get; set; }

    //UserControl1 View Model for MainWindow
    public UserControl1ViewModel UC1Property { get; set; }

}

问题:现在,如何将用户控件的数据上下文传递到主窗口中?

-----------------------------In MainWindow.xaml----------------------
<local:UserControl1 DataContext="{Binding UC1Property}"/>  //tried binding the Usercontrol1VM obj on MainWindowVM
-----------------------------In MainWindowViewModel.cs---------------
//UserControl1 View Model for MainWindow
public UserControl1ViewModel UC1Property { get; set; }

我尝试的上述代码无法按预期工作。 通过窗口传递用户控件的数据上下文的标准方法是什么?

将主窗口上的用户控件视图模型与 MVVM 绑定

你对MVVM、视图和用户控件有一个普遍的误解。

UserControl是一段可重用的代码,它不特定于一种应用程序。话虽如此, 没有UserControl1ViewModel ,当您创建一个新UserControl .

UserControl是自我维持的,用户控件所需的所有逻辑都包含在代码隐藏中。为了明确起见,这并不违反 MVVM 模式。MVVM 模式适用于视图和视图模型以及它们的交互方式。

View之间有一个微妙的区别(纯 XAML,没有逻辑(。视图也经常继承自UserControl,但View只在您现在正在开发的应用程序中有效。您不太可能在其他应用程序中重用它。

这是UserControl之间的区别.例如,日历用户控件是可重用的,用于选择和显示日历的所有逻辑都是其控件代码隐藏的一部分,您可以在多种应用程序中使用它。

创建使用数据绑定的UserControl时,需要在用户控件中公开依赖项属性,在日期选取器用户控件上,这可能是MinDateMaxDateSelectedDateFirstDayOfTheWeek(星期日或星期一(和/或控制格式的属性,并在UserControl的 XAML 中隐藏所有其他属性(通过不通过依赖项属性公开它们(。