c# - WPF View 谁导致另一个使用 MVVM

标签 c# wpf mvvm binding

我正在尝试使用 MVVM 模式在 View 之间设置导航。我的应用程序包含一个 MainWindow 和两个 View ,每个 View 都有一个按钮。当我单击 View1 中的按钮时,我想在 MainWindow 上设置 View2

我发现有几个教程解释了如何使用主窗口上的按钮(模拟 tabControl)从一个 View 导航到另一个 View ,它有效,但不是我想要的。

我正在寻找类似的东西:

View1_View.xaml.cs:

public partial class View1_View : UserControl
{
    private View1_ViewModel _viewModel = new View1_ViewModel();

    public View1_View()
    {
        InitializeComponent();
    }

    private void Btn_SwitchToView2_Click(object sender, RoutedEventArgs e)
    {
        MainWindow.SwitchToView2();
    }
}

主窗口.xaml.cs:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new View1_View();
    }

    public void SwitchToView2()
    {
        this.DataContext = new View2_View();
    }
}

我的问题是,如果我这样做,我无法从 View1_View 类访问 SwitchToView2() 方法,如果它不是static ,如果它是静态的,我将失去 MainWindow 的上下文。

我应该如何进行? 谢谢。

最佳答案

我建议使用 ContentControl 来切换主视图的一部分。

这可能看起来像这样(简短形式只是为了给您一个想法;没有 INotifyPropertyChanged)。

创建一个ISwitchableViewModel 类型的空接口(interface)。

将属性添加到您的主 ViewModel

public property ISwitchableViewModel MyViewModel {get; set;}

创建两个实现接口(interface) ISwitchableViewModel 的类。每个您想要显示的 View (View1View2 在您的示例中)并将它们称为 ViewModel1ViewModel2 .

当您按下 xaml 中的按钮时,将 MyViewModel 设置为 View1View2;不管你的逻辑是什么。

在您的 xaml 中,将其添加到您想要显示可切换内容的位置。

<ContentControl Content="{Binding MyViewModel}">
    <ContentControl.Resources>
        <DataTemplate DataType="{x:Type viewModel:ViewModel1}">
            <view:View1 />
        </DataTemplate>
        <DataTemplate DataType="{x:Type viewModel:ViewModel2}">
            <view:View2 />
        </DataTemplate>
    </ContentControl.Resources>
</ContentControl>

当您在 MainViewModel 中设置 MyViewModel 时,UI 将自动显示该 View 模型的正确 View 。

关于c# - WPF View 谁导致另一个使用 MVVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44716572/

相关文章:

c# - 从其他程序集实例化 ResourceDictionary xaml

c# - 如何在 ViewModel 更改后正确更新模型?

c# - 如何最好地重构嵌套 switch 语句?

windows-phone-7 - 使用 MVVM 从 ListBox 中删除项目

android - 如何使用 Koin 对 MVVM 进行单元测试?

android - LiveData、MVVM 和存储库模式

C# 泛型和类型

c# - 通过 MSBuild 执行 Powershell 脚本时找不到 "Microsoft.SqlServer.BatchParser.dll"

c# - AssemblyInfo.cs 中的 C# 程序中的 GUID 是什么?

.net - 找不到请求的.Net Framework数据提供程序