将ViewModel绑定到ContentControl作为其DataContext

时间:2012-07-19 23:24:27

标签: c# wpf mvvm

我想在按钮点击时更改UserControls(我不会在这里复杂化,所以我只会提到重要的部分)。因此,想法是将这些UserControl的ViewModels绑定到ContentControl,然后使用DataTemplates将它们关联起来。 这是代码:

<Window x:Class="Project.MainWindow">
<Window.Resources>
    <DataTemplate DataType="{x:Type UserControl:ViewUserControlViewModel}" >
        <UserControl:ViewUserControl/>
    </DataTemplate>
    <DataTemplate DataType="{x:Type UserControl:EditUserControlViewModel}" >
        <UserControl:EditUserControl/>
    </DataTemplate>
</Window.Resources>
<Grid>
    <ContentControl DataContext="{Binding UserControlViewModel}" />
    <Button Content="View" Click="ChangeToView()"/>
    <Button Content="Edit" Click="ChangeToEdit()"/>
</Grid>
</Window>

视图模型:

public class MainWindowViewModel : DependencyObject
{
    public DependencyObject UserControlViewModel
    {
        get { return (DependencyObject)GetValue(UserControlViewModelProperty); }
        set { SetValue(UserControlViewModelProperty, value); }
    }
    public static readonly DependencyProperty UserControlViewModelProperty = 
           DependencyProperty.Register("UserControlViewModel", typeof(DependencyObject), typeof(MainWindowViewModel), new PropertyMetadata());

    public MainWindowViewModel()
    {
        UserControlViewModel = new EditUserControlViewModel();
    }
}

但这是一个问题。当我开始项目时,我只看到按钮而不是任何UserControls。我做错了什么?

3 个答案:

答案 0 :(得分:10)

如果Window.DataContext已正确设置为MainWindowViewModel,则应执行此作业

<ContentControl Content="{Binding UserControlViewModel}" />

答案 1 :(得分:2)

在执行mvvm时,您的viewmodel应该实现INotifyPropertyChanged而不是从DependencyObject继承。

public class MainWindowViewModel : INotifyPropertyChanged
{
   private object _currentWorkspace; //instead of object type you can use a base class or interface
   public object CurrentWorkspace
   {
      get { return this._currentWorkspace; }
      set { this._currentWorkspace = value; OnPropertyChanged("CurrentWorkspace"); }
   }


   public MainWindowViewModel()
   {
      CurrentWorkspace= new EditUserControlViewModel();
   }

   //todo: to switch the workspace, create DelegeCommand/RelayCommand and set the CurrentWorkspace
   //if you don't know about these commands let me know and i post it

   public ICommand SwitchToViewCommand {get{...}}
   public ICommand SwitchToEditCommand {get{...}}
}

xaml:您应该将Content Property设置为CurrentWorkspace。

<ContentPresenter Content="{Binding UserControlViewModel}" />
<Button Content="View" Comamnd="{Binding SwitchToViewCommand}"/>
<Button Content="Edit" Comamnd="{Binding SwitchToEditCommand}"/>

!不要忘记将窗口的DataContext设置为MainWindowViewModel实例。

答案 2 :(得分:1)

首先,您应该发布UserControl的代码,因为(在上面的代码片段中)它负责显示一些数据。

其次,你没有绑定代码中的任何内容。

第三,ViewModel的实现是错误的。您不需要继承DependencyObject,而是实现INotifyPropertyChanged接口,以便建立能够通知您的View的ViewModel。

第四,我不知道你在做什么

<ContentControl DataContext="{Binding UserControlViewModel}" />

也许你可以进一步解释一下?

第五,当实现MVVM模式(你当前没有做过)时,你应该避免使用像click事件这样的事件,而是使用命令。

(我知道这还不是一个真正的答案,但我不想写评论语法)