我正试图从一个View Model
导航到另一个没有任何侧面小组。
例如,我有一个Main Window View
,这是我加载User Control
的地方。
我尝试从MainViewModel
访问静态实例以更改视图,但它无效。
MainWindow.xaml
<Window.Resources>
<DataTemplate DataType="{x:Type vm:FirstViewModel}">
<v:FirstView/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:SecondViewModel}">
<v:SecondView/>
</DataTemplate>
</Window.Resources>
<ContentControl Content="{Binding CurrentViewModel}"/>
MainViewModel.cs
class MainviewModel : ObservableObject
{
private ObservableObject _currentViewModel = new FirstViewModel();
public ObservableObject CurrentViewModel
{
get { return _currentViewModel; }
set
{
_currentViewModel = value;
RaisePropertyChangedEvent("CurrentViewModel");
}
}
private static MainViewModel _instance = new MainViewModel();
public static MainViewModel Instance { get { return _instance; } }
}
在这里,我有FirstView
,它只包含一个按钮和其他几个UI设计
FirstView.xaml
<Button Command="{Binding goToSecondView}" />
FirstViewModel.cs
class FirstViewModel : ObservableObject
{
public ICommand goToSecondView
{
get
{
return new DelegateCommand(() =>
{
MainViewModel.Instance.CurrentViewModel = new SecondViewModel();
});
}
}
}
我有SecondView
,与FirstView
类似,只是导航到FirstView
我尝试过搜索解决方案,但到目前为止,我只是设法找到一个显示按钮的示例,然后允许切换User Control
点击这些按钮。
我想要实现的是通过User Control
本身上的按钮启用User Control
切换,而不需要任何侧面板。
非常感谢任何帮助,肯定会帮助我完成未来的项目。
谢谢。
答案 0 :(得分:2)
您正在创建两个不同的MainViewModel实例。第一个可能是由定位器或其他东西创建的,它是您的视图在首次创建窗口时绑定到的那个。然后创建第二个实例并将其分配给自己的静态实例成员:
private static MainViewModel _instance = new MainViewModel();
public static MainViewModel Instance { get { return _instance; } }
当您按下按钮时,您的ICommand处理程序正在更改此实例,而该按钮未绑定到任何内容。一般来说,您应该使用依赖注入框架来确保它是一个真正的单例,但现在只需执行以下操作:
public MainViewModel()
{
Instance = this;
}
public static MainViewModel Instance { get; private set; }
你的代码也调用了RaisePropertyChangedEvent(&#34; CurrentViewModel&#34;)......我很确定你的意思是RaisePropertyChanged(&#34; CurrentViewModel&#34;)。
答案 1 :(得分:0)
我会采用另一种方式,从第一个和第二个视图模型中公开一个事件,如
public event EventHandler<ShowMeEventArgs> ShowMeEvent;
然后您的主要需要订阅此事件并可以显示viewmodel。甚至更多你的第一个和第二个视图模型不需要知道来自mainviewmodel
的任何内容