使用 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
时,您需要在用户控件中公开依赖属性,在日期选择器用户控件上,这可能是MinDate
、MaxDate
、SelectedDate
、@ 987654333@(星期日或星期一)和/或控制格式的属性和隐藏UserControl
s XAML 中的所有其他属性(通过不通过依赖属性公开它们)。
【讨论】:
噢!非常有意思。 .我对 MVVM 及其实现有不同的看法。感谢您纠正我。以上是关于使用 MVVM 在 MainWindow 上绑定 UserControl 视图模型的主要内容,如果未能解决你的问题,请参考以下文章
Mvvm KeyDown的实现以及TextBox绑定的属性不更新问题的解决