我正在尝试遵循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
的代码包含一个属性CurrentView
和ICommand
,因此我可以切换 View 。定义如下: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>
当我启动该应用程序时,它不会注册该事件,并且单击按钮不会触发该事件以更改 View 。我尝试将断点放在
ICommand get
和函数调用本身中。起初,我以为可能需要在数据模板中定义MainViewModel
,但这样做会导致以下错误(即使项目构建良好)谁能提供我需要进行这项工作的丢失物品?
最佳答案
AncestorType应该是MainWindow而不是MainViewModel。 MainViewModel不是属于可视化树的一部分的类。