Я работаю над унаследованным продуктом, в котором все до сих пор было сделано с использованием оконных форм. Из-за требований, связанных с высоким использованием XML, я использую WPF из-за простоты привязки. Я использую модель MVVM, так как требование требует разных представлений, но не имеет большого значения в бизнес-логике. У меня есть пользовательский элемент управления, в котором есть кнопка для открытия формы окна. И этот пользовательский элемент управления снова находится в разных формах окон.Открыть форму окна из ViewModel
Это код для моего 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>
И здесь является обязательной командой с помощью кнопки
<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;
}
}
Я знаю, что можно легко найти родительскую форму из кода UserControl, используя следующий фрагмент кода:
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;
}
Так вот мои вопросы:
Есть ли способ передать элемент пользовательского интерфейса от элемента управления до ViewModel?
Должен ли мы передать ссылку на элемент пользовательского интерфейса на ViewModel?
Если нет, то что это лучший способ решить вышеуказанную проблему?