WPF从用户控件MVVM更改视图

时间:2014-11-27 09:50:17

标签: c# wpf xaml mvvm

我正试图从一个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切换,而不需要任何侧面板。

非常感谢任何帮助,肯定会帮助我完成未来的项目。

谢谢。

2 个答案:

答案 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

的任何内容