gpt4 book ai didi

c# - 在按钮上打开一个新窗口单击 WPF MVVM

转载 作者:太空狗 更新时间:2023-10-29 23:53:22 30 4
gpt4 key购买 nike

我正在学习 WPF MVVM,并希望在主窗口单击按钮时打开一个新窗口。

我知道每个 View 都必须有一个等效的 ViewModel,而 MVVM 的基本原则之一是 ViewModel 不能知道任何关于 View 的信息。

因此,任何人都可以为我提供一个简单干净的示例,该示例不违反任何关于如何创建具有以下功能的两个 View 和两个 ViewModel 的 MVVM 原则:

通过单击主视图中的按钮显示新 View 。

最佳答案

您可以创建一个单独的服务来将 View 作为对话框启动,以便它可以在整个应用程序中以通用的方式使用。并将通过想要启动任何对话框的构造函数将此服务注入(inject)到 ViewModel。

public interface IDialogWindowService<T>
{
void Show();
void ShowDialog();
}

public class DialogWindowService<T> : IDialogWindowService<T> where T : Window
{
public void Show()
{
container.Resolve<T>().Show();
}

public void ShowDialog()
{
container.Resolve<T>().ShowDialog();
}
}

现在只需将此服务注入(inject)相应的 ViewModel。

public class YourViewModel
{
//commands
public ICommand someCommand { get; set; }

private IDialogWindowService<BookingView> _dialogService;
public YourViewModel(IDialogWindowService<YourView > dialogService)
{
_dialogService = dialogService
someCommand = new RelayCommand(someCommandDoJob, () => true);
}

public void someCommandDoJob(object obj)
{
//Since you want to launch this view as dialog you can set its datacontext in its own constructor.
_dialogService.ShowDialog();
}
}

您可以使用DataTemplates 来改变 View 。它允许根据 ViewModel 动态切换 Views:

<Window>
<Window.Resources>
<DataTemplate DataType="{x:Type ViewModelA}">
<localControls:ViewAUserControl/>
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModelB}">
<localControls:ViewBUserControl/>
</DataTemplate>
<Window.Resources>
<ContentPresenter Content="{Binding CurrentView}"/>
</Window>

如果 Window.DataContext 是 ViewModelA 的一个实例,那么将显示 ViewA 并且

Window.DataContext是ViewModelB的一个实例,那么ViewB就会显示出来。

我见过和读过的最好的例子是 Rachel Lim 做的。 See the example.

关于c# - 在按钮上打开一个新窗口单击 WPF MVVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37294152/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com