C# 更改内容类型问题

C# 更改内容类型问题,c#,wpf,xaml,C#,Wpf,Xaml,这个问题已经被回答了好几次了,但我似乎无法把解决方案放在一起。下面是我通过各种论坛粘在一起的内容。我也是WPF的新手。我正在尝试根据一些参数切换MainWindow.xaml的内容。我所拥有的: <Window.Resources> <DataTemplate x:Key="LogsGriDataTemplate" DataType="{x:Type viewModel:ViewModel1}"> <Label>This is a lo

这个问题已经被回答了好几次了,但我似乎无法把解决方案放在一起。下面是我通过各种论坛粘在一起的内容。我也是WPF的新手。我正在尝试根据一些参数切换MainWindow.xaml的内容。我所拥有的:

<Window.Resources>
    <DataTemplate x:Key="LogsGriDataTemplate" DataType="{x:Type viewModel:ViewModel1}">
        <Label>This is a log</Label>
    </DataTemplate>
    <DataTemplate x:Key="ReportsGridDataTemplate" DataType="{x:Type viewModel:ViewModel2}">
        <Label>This is a report</Label>
    </DataTemplate>
</Window.Resources>

<ContentControl Grid.Row="1" Grid.Column="0" Content="{Binding CurrentPageViewModel}" />

private ViewModel1 _viewModel1 = new ViewModel1();
private ViewModel2 _viewModel2 = new ViewModel2();

private DataTemplate _CurrentPageViewModel;
public DataTemplate CurrentPageViewModel 
{
    get { return _CurrentPageViewModel; }
    set { Set(() => CurrentPageViewModel, ref _CurrentPageViewModel, value); } 
}

public void OnButtonPressMethod(object param)
{
    if (view == 0)
    {
        CurrentPageViewModel = _viewModel1;
    }
    else
    {
        CurrentPageViewModel = _viewModel1;
    }
}

编译器正在抱怨CurrentPageViewModel=\u viewModel1/2语句表示无法将类型ViewModel设置为类型DataTemplate,这是有意义的。CurrentPageViewModel属性应该是什么?这个代码还有什么问题吗?谢谢。

绑定源应该是您的视图模型,而不是数据模板。XAML中具有数据类型定义的数据模板将自动将内容绑定到与该类型匹配的数据模板

因此,您可以为视图模型1和2创建公共接口/基类:

public interface IViewModel { }
public class ViewModel1 : IViewModel { }
public class ViewModel2 : IViewModel { }

private IViewModel _viewModel1 = new ViewModel1();
private IViewModel _viewModel2 = new ViewModel2();

private IViewModel _CurrentPageViewModel;
public IViewModel CurrentPageViewModel 
{
    get { return _CurrentPageViewModel; }
    set { Set(() => CurrentPageViewModel, ref _CurrentPageViewModel, value); } 
}

我还需要澄清一下这个语句->DataType={x:Type viewModel:ViewModel2}这是将该数据模板的数据上下文设置为ViewModel2还是需要在代码中切换上下文?@KrisW嗯,它没有将数据上下文设置为这样。它告诉XAML编译器将ViewModel2类型的对象绑定到此数据模板。因此,当您将内容控件设置为ViewModel2实例时,将应用ReportsGridDataTemplate,此时它将具有该视图模型实例的数据上下文,我更喜欢使用BaseViewModel并在其中实现INotifyPropertyChanged接口,以便其他视图模型不必这样做。这样,我的属性看起来更像这样,但它们的工作方式相同:public BaseViewModel ViewModel{get;set;}。这只是问题作者的评论