使用 MVVM 在 MainWindow 上绑定 UserControl 视图模型

Posted

技术标签:

【中文标题】使用 MVVM 在 MainWindow 上绑定 UserControl 视图模型【英文标题】:Binding UserControl View model on MainWindow with MVVM 【发布时间】:2016-05-25 12:21:58 【问题描述】:

我是 WPF 和 MVVM 的新手,我正在尝试了解 WPF 如何与 MVVM 一起工作。为此,我制作了如下示例

UserControl1.xaml

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

UserControl1ViewModel.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();

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; 



问题:现在,如何将 Usercontrol 的 Datacontext 传递到 MainWindow?

-----------------------------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; 

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

【问题讨论】:

我认为您想重新考虑这一点。你为什么要使用 UserControl,因为你的主视图是这样绑定的? @Stefan。 .这只是一个更好理解的示例。 .我希望这是应该如何实施的。如果我错了,请纠正我。 @Gopichandar:请参阅下面的答案。自定义用户控件没有自己的 ViewModel。它们应该是可重用的,并且 ViewModel 是非常特定于您正在开发的应用程序的东西。 MVVM 模式用于应用程序开发,而不是用于用户控件 【参考方案1】:

您在这里对 MVVM、视图和用户控件有一个普遍的误解。

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

UserControl 是自我维持的,您的用户控件所需的所有逻辑都在代码后面。明确地说,这违反了 MVVM 模式。 MVVM 模式适用于视图和视图模型以及它们如何交互。

View 之间存在细微差别(纯 XAML,没有逻辑)。视图也经常从UserControl 继承,但View 仅适用于您现在正在开发的应用程序。您不太可能在另一个应用程序中重用它。

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

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

【讨论】:

噢!非常有意思。 .我对 MVVM 及其实现有不同的看法。感谢您纠正我。

以上是关于使用 MVVM 在 MainWindow 上绑定 UserControl 视图模型的主要内容,如果未能解决你的问题,请参考以下文章

组合框绑定MVVM C#

Mvvm KeyDown的实现以及TextBox绑定的属性不更新问题的解决

WPF的MVVM模式

WPF MVVM:MainWindow导航

如何使用 MVVM Light Toolkit 打开一个新窗口

“在匹配指定绑定约束的类型'TestWPF.MainWindow'上调用构造函数引发异常。” - 如何解决这个问题?