使用MVVM的WPF导航

时间:2015-06-15 16:01:26

标签: c# .net wpf mvvm

我试图遵循答案provided in this post,但我必须错过一些微不足道的事情。我已将DataTemplate定义为App.xaml,如下所示:

<Application.Resources>
    <DataTemplate DataType="{x:Type vm:BlowerViewModel}">
        <v:BlowerView />
    </DataTemplate>
    <DataTemplate DataType="{x:Type vm:HomeViewModel}">
        <v:HomeView />
    </DataTemplate>
</Application.Resources>

然后,在我的MainWindow.xaml我定义了以下代码:

<Window x:Class="App.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:vm="clr-namespace:App.UI.ViewModel"
        Title="MainWindow" SizeToContent="WidthAndHeight">
    <Window.DataContext>
        <vm:MainViewModel />
    </Window.DataContext>
    <ContentControl Content="{Binding CurrentView}" />
</Window>

MainViewModel的代码包含属性CurrentViewICommand,因此我可以切换视图。定义如下:

public class MainViewModel : BaseViewModel
{
    private BaseViewModel _currentView;

    public MainViewModel()
    {
        CurrentView = new HomeViewModel();
    }

    public BaseViewModel CurrentView
    {
        get { return _currentView; }
        set
        {
            if (_currentView != value)
            {
                _currentView = value;
                RaiseChangedEvent("CurrentView");
            }
        }
    }

    public ICommand SwitchView { 
        get {
            return new CommandHandler(() => SwitchBlower());
        }
    }

    protected void SwitchBlower()
    {
        CurrentView = new BlowerViewModel(); 
    }
}

在我的HomeView.xaml中,我定义了一个链接到MainViewModel的按钮来执行SwitchView ICommand。如下所示。

<UserControl x:Class="App.UI.View.HomeView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:vm="clr-namespace:App.UI.ViewModel"
        Height="300" Width="300">
    <Grid>
        <TextBlock>This is the homeview</TextBlock>
        <Button Command="{Binding DataContext.SwitchView, RelativeSource={RelativeSource AncestorType={x:Type vm:MainViewModel}}, Mode=OneWay}" Content="Test" />
    </Grid>
</UserControl>

当我启动应用程序时,它不会注册该事件,并且单击该按钮不会触发事件以更改视图。我尝试在ICommand get和函数调用本身中设置断点。起初,我想我可能需要在我的数据模板中定义MainViewModel,但这样做会导致以下错误(即使项目构建正常)

  

不能将窗口设置为样式

任何人都可以提供我需要的缺失部分吗?

1 个答案:

答案 0 :(得分:3)

AncestorType应该是MainWindow而不是MainViewModel。 MainViewModel不是可视树的一部分。