从用户控件 MVVM 更改 WPF 视图
本文关键字:WPF 视图 更改 MVVM 用户 控件 | 更新日期: 2023-09-27 18:32:08
我正在尝试在没有任何侧面板的情况下从一个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}"/>
主视图模型.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}" />
第一视图模型.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
切换,而无需任何侧面板。
任何帮助将不胜感激,并且肯定会在我未来的项目中帮助我。
谢谢。
您正在创建两个不同的 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("CurrentViewModel")...我很确定你的意思是RaisePropertyChanged("CurrentViewModel")。
我会走另一种方式,从您的第一和第二视图模型公开一个事件,例如
public event EventHandler<ShowMeEventArgs> ShowMeEvent;
然后你的主 只需要订阅这个事件,就可以显示视图模型。 甚至更多 您的第一和第二视图模型不需要从主视图模型知道任何信息