从用户控件 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切换,而无需任何侧面板。

任何帮助将不胜感激,并且肯定会在我未来的项目中帮助我。

谢谢。

从用户控件 MVVM 更改 WPF 视图

您正在创建两个不同的 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;

然后你的主 只需要订阅这个事件,就可以显示视图模型。 甚至更多 您的第一和第二视图模型不需要从主视图模型知道任何信息