gpt4 book ai didi

c# - 从 ViewModel 打开一个窗口窗体

转载 作者:太空宇宙 更新时间:2023-11-03 12:58:59 25 4
gpt4 key购买 nike

我正在开发一个遗留产品,其中直到现在的所有内容都是使用 Windows 窗体制作的。由于涉及大量使用 XML 的要求,我使用 WPF,因为它易于绑定(bind)。我正在使用 MVVM 模型,因为需求需要不同的 View ,但业务逻辑没有太大差异。 我有一个用户控件,它有一个打开窗口窗体的按钮。而这个用户控件又是在不同的窗体上。

这是我的与按钮相关的 xaml 代码:

<UserControl x:Name="ctrlTemplate" x:Class= "CtrlTemplate"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WPFControl.UI"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:xckt="clr-namespace:Xceed.Wpf.Toolkit;assembly=Xceed.Wpf.Toolkit"
mc:Ignorable="d"
DataContext="{DynamicResource ViewModel}">
<UserControl.Resources>
<local:ViewModel x:Key="ViewModel" />
</ResourceDictionary>
</UserControl.Resources>

这是与按钮绑定(bind)的命令

<Button x:Name="btnOpenWindowsUI" Command="{Binding OpenWindowsUI, Source={StaticResource ViewModel}}" CommandParameter={????} >

我的 ViewModel 是这样的:

public class ViewModel : ViewModelBase
{
public ICommand OpenWindowsUI{ get; set; }
public OTCViewModel()
{
OpenWindowsUI= new OpenWindowsUI(this);
}
}

我的命令是这样的:

class OpenWindowsUI: ICommand
{
private ViewModel _mvModel;
public event EventHandler CanExecuteChanged
{
add { }
remove { }
}
public ClearAllData(ViewModel mvModel)
{
_mvModel = mvModel;
}

public bool CanExecute(object parameter)
{
return true;
}

public void Execute(object parameter)
{
IWindowsUI indowsUIInstance = null;
windowsUIInstance = _container.Resolve<IWindowsUI >();
frmWindowsUI = windowsUIInstance.Reference();
frmWindowsUI.Owner = this; **//How can we specify the parent of this chid form?**
frmWindowsUI.ShowInTaskbar = false;
windowsUIInstance.SetUp();
frmWindowsUI.Show();
frmWindowsUI.FormClosed += frmWindowsUI_FormClosed;
}
}

我知道可以使用以下代码片段轻松地从用户控件代码中找到父表单:

public Form FindParentWindowsForm()
{
var source = (HwndSource)PresentationSource.FromDependencyObject(btnOpenWindowsUI);
Form form;
if (source != null)
{
var host = (System.Windows.Forms.Integration.ElementHost)System.Windows.Forms.Control.FromChildHandle(source.Handle);
if (host != null)
{
form = (Form)host.TopLevelControl;
}
}
return form;
}

所以这是我的问题:

  1. 有没有办法将 UI 元素从控件传递到 ViewModel?

  2. 我们应该将 UI 元素的引用传递给 ViewModel 吗?

  3. 如果不是,解决上述问题的最佳方法是什么?

最佳答案

但是我没有适合您的完整解决方案:

.1。是的你可以 - 例如下面的代码将整个 Window 对象作为 CommandParameter 传递:

    <button [...] CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=Window}}"/>

.2。这个问题是典型的 MVVM 辩论的主题。一方面,UIElement 只是一个对象,从高级角度来看,它与 Properties 等其他对象并没有什么不同,但另一方面,将 UIElement 作为参数传递有点破坏 MVVM,因为从这一刻起,ViewModel 将意识到风景。

.3。您是否有权访问要以任何方式在用户控件中传递的元素?

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

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