gpt4 book ai didi

c# - 在 MVVM 中打开一个新窗口

转载 作者:可可西里 更新时间:2023-11-01 08:56:34 28 4
gpt4 key购买 nike

假设我有一个 MainWindow 和一个 MainViewModel,我没有使用 MVVM LightPrism在这个例子中。
在此 MainWindow 中,我想单击 MenuItemButton 以打开 NewWindow.xaml 而不是 用户控件
我知道如何将它与 UserControl 一起使用,以在 ContrntControlFrame 中的现有窗口中打开一个新的 UserControl >.

<ContentControl Content="{Binding Path=DisplayUserControl,UpdateSourceTrigger=PropertyChanged}" />

代码

public ViewModelBase DisplayUserControl
{
get
{
if (displayUserControl == null)
{
displayUserControl = new ViewModels.UC1iewModel();
}
return displayUserControl;
}
set
{
if (displayUserControl == value)
{
return;
}
else
{
displayUserControl = value;
OnPropertyChanged("DisplayUserControl");
}
}
}

MainWindowResourceDitionary 中,我有:

<DataTemplate DataType="{x:Type localViewModels:UC1ViewModel}">
<localViews:UC1 />
</DataTemplate>
<DataTemplate DataType="{x:Type localViewModels:UC2ViewModel}">
<localViews:UC2 />
</DataTemplate>

问题是我想打开一个新的 Window,而不是 UserControl。所以我使用了一些这样的代码:

private ICommand openNewWindow;

public ICommand OpenNewWindow
{
get { return openNewWindow; }
}

public void DoOpenNewWindow()
{
View.NewWindowWindow validationWindow = new View.NewWindow();
NewWindowViewModel newWindowViewModel = new NewWindowViewModel();
newWindow.DataContext = ewWindowViewModel;
newWindow.Show();
}

然后将 OpenNewWindow 绑定(bind)到 MenuItemButton
我知道这不是正确的方法,但正确的方法是什么?

谢谢!

最佳答案

对于此类应用程序,您需要解决两个问题。

首先,您不希望 View-Model 直接创建和显示 UI 组件。使用 MVVM 的动机之一是在您的 View 模型中引入测试能力,并且让此类弹出新窗口会使此类更难测试。

您需要解决的第二个问题是如何解决应用程序中的依赖关系,或者在这种情况下 – 如何将 View 模型“连接”到相应的 View ?后一个问题的可维护解决方案是使用 DI 容器。 Mark Seemann 的 Dependency Injection in .NET 给出了关于这个主题的一个很好的引用。 .他居然也讨论了如何解决第一个问题!

要解决前一个问题,您需要在代码中引入一个间接层,使 View-Model 不依赖于创建新窗口的具体实现。下面的代码给出了一个非常简单的例子:

public class ViewModel
{
private readonly IWindowFactory m_windowFactory;
private ICommand m_openNewWindow;

public ViewModel(IWindowFactory windowFactory)
{
m_windowFactory = windowFactory;

/**
* Would need to assign value to m_openNewWindow here, and associate the DoOpenWindow method
* to the execution of the command.
* */
m_openNewWindow = null;
}

public void DoOpenNewWindow()
{
m_windowFactory.CreateNewWindow();
}

public ICommand OpenNewWindow { get { return m_openNewWindow; } }
}

public interface IWindowFactory
{
void CreateNewWindow();
}

public class ProductionWindowFactory: IWindowFactory
{

#region Implementation of INewWindowFactory

public void CreateNewWindow()
{
NewWindow window = new NewWindow
{
DataContext = new NewWindowViewModel()
};
window.Show();
}

#endregion
}

请注意,您在 View-Model 的构造函数中实现了 IWindowFactory,新窗口的创建委托(delegate)给了这个对象。这允许您在测试期间用不同的生产实现替换。

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

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