使用MVVM绑定MainWindow上的UserControl View模型

时间:2016-02-14 17:45:23

标签: c# wpf xaml mvvm user-controls

我是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的datacontext的标准方法是什么?

1 个答案:

答案 0 :(得分:5)

你对MVVM,Views和UserControls有一个普遍的误解。

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

UserControl是自我维持的,用户控制所需的所有逻辑都在代码中。为清楚起见,这是违反MVVM模式。 MVVM模式适用于Views和ViewModel以及它们如何交互。

View(纯XAML,无逻辑)之间存在细微差别。视图通常也继承自UserControl,但View仅适用于您正在开发的应用程序。您不太可能在其他应用程序中重用此功能。

UserControl之间存在差异。例如,日历用户控件是可重复使用的,并且选择和显示日历的所有逻辑都是其后面的控制代码的一部分,您可以在许多类型的应用程序中使用它。

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