将ViewModel绑定到ContentControl作为其DataContext

kr8*_*r85 5 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>
Run Code Online (Sandbox Code Playgroud)

视图模型:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

LPL*_*LPL 11

如果您Window.DataContext正确设置MainWindowViewModel为此应该完成工作

<ContentControl Content="{Binding UserControlViewModel}" />
Run Code Online (Sandbox Code Playgroud)

  • 你是救星。 (2认同)