[英]Which is the best way for creating new windows using the MVVM design pattern
我想问问哪种是使用MVVM模式和MVVMLight框架显示子窗口的最佳方法。 我已经在此站点上阅读了几个线程,但是我似乎并不理解所编写的代码到底在做什么,因此请提供您的想法的详细说明。
我使用一项服务来显示新窗口或新对话框。
您可以在此处查看我的第一个版本的对话框
我最近几天在界面上添加了一些重载
public interface IUIDialogWindowService
{
///<summary>
/// Zeigt ein Dialog an.
///</summary>
///<param name="titel">Titel für den Dialog</param>
///<param name="datacontext">DataContext für den Dialog</param>
///<returns>true wenn DialogResult=true, ansonsten false</returns>
bool? ShowDialog(string titel, object datacontext);
///<summary>
/// Zeigt ein Dialog an.
///</summary>
///<param name="titel">Titel für den Dialog</param>
///<param name="datacontext">DataContext für den Dialog</param>
///<param name="minHeigth">Minimum Height</param>
///<param name="minWidth">Minimum Width</param>
///<param name="maxHeigth">Maximum Height</param>
///<param name="maxWidth">Maximum Width</param>
///<returns>true wenn DialogResult=true, ansonsten false</returns>
bool? ShowDialog(string titel, object datacontext, double minHeigth = 0, double minWidth=0, double maxHeigth = double.PositiveInfinity, double maxWidth = double.PositiveInfinity);
/// <summary>
/// Zeigt ein Dialog an
/// </summary>
/// <param name="titel">Titel für den Dialog<</param>
/// <param name="datacontext">DataContext für den Dialog</param>
/// <param name="settings">ApplicationsSetting für Height and Width</param>
/// <param name="pathHeigthSetting">Name für Height Setting</param>
/// <param name="pathWidthSetting">Name für Width Setting</param>
/// <param name="minHeigth">Minimum Height</param>
/// <param name="minWidth">Minimum Width</param>
/// <param name="maxHeigth">Maximum Height</param>
/// <param name="maxWidth">Maximum Width</param>
/// <returns>true wenn DialogResult=true, ansonsten false</returns>
bool? ShowDialog(string titel, object datacontext, ApplicationSettingsBase settings, string pathHeigthSetting, string pathWidthSetting, double minHeigth = 0, double minWidth = 0, double maxHeigth = double.PositiveInfinity, double maxWidth = double.PositiveInfinity);
}
///<summary>
/// Implementierung von <see cref="IUIDialogWindowService"/>
///</summary>
[PartCreationPolicy(CreationPolicy.Shared)]
[Export(typeof(IUIDialogWindowService))]
public class WpfUIDialogWindowService : IUIDialogWindowService
{
#region Implementation of IUIDialogWindowService
///<summary>
/// Zeigt ein Dialog an.
///</summary>
///<param name="titel">Titel für den Dialog</param>
///<param name="datacontext">DataContext für den Dialog</param>
///<returns>true wenn DialogResult=true, ansonsten false</returns>
public bool? ShowDialog(string titel, object datacontext)
{
var win = new DialogWindow {Title = titel, DataContext = datacontext};
return win.ShowDialog();
}
///<summary>
/// Zeigt ein Dialog an.
///</summary>
///<param name="titel">Titel für den Dialog</param>
///<param name="datacontext">DataContext für den Dialog</param>
///<param name="minHeigth">Minimum Height</param>
///<param name="minWidth">Minimum Width</param>
///<param name="maxHeigth">Maximum Height</param>
///<param name="maxWidth">Maximum Width</param>
///<returns>true wenn DialogResult=true, ansonsten false</returns>
public bool? ShowDialog(string titel, object datacontext, double minHeigth = 0, double minWidth = 0, double maxHeigth = double.PositiveInfinity, double maxWidth = double.PositiveInfinity)
{
var win = new DialogWindow { Title = titel, DataContext = datacontext };
win.MinHeight = minHeigth;
win.MinWidth = minWidth;
win.MaxHeight = maxHeigth;
win.MaxWidth = maxWidth;
return win.ShowDialog();
}
/// <summary>
/// Zeigt ein Dialog an
/// </summary>
/// <param name="titel">Titel für den Dialog<</param>
/// <param name="datacontext">DataContext für den Dialog</param>
/// <param name="settings">ApplicationsSetting für Height and Width</param>
/// <param name="pathHeigthSetting">Name für Height Setting</param>
/// <param name="pathWidthSetting">Name für Width Setting</param>
/// <param name="minHeigth">Minimum Height</param>
/// <param name="minWidth">Minimum Width</param>
/// <param name="maxHeigth">Maximum Height</param>
/// <param name="maxWidth">Maximum Width</param>
/// <returns>true wenn DialogResult=true, ansonsten false</returns>
public bool? ShowDialog(string titel, object datacontext, ApplicationSettingsBase settings, string pathHeigthSetting, string pathWidthSetting, double minHeigth = 0, double minWidth = 0, double maxHeigth = double.PositiveInfinity, double maxWidth = double.PositiveInfinity)
{
var win = new DialogWindow { Title = titel, DataContext = datacontext };
win.MinHeight = minHeigth;
win.MinWidth = minWidth;
win.MaxHeight = maxHeigth;
win.MaxWidth = maxWidth;
try
{
if(settings != null)
{
win.SizeToContent = SizeToContent.Manual;
var height = settings[pathHeigthSetting];
var width = settings[pathWidthSetting];
BindingOperations.SetBinding(win, FrameworkElement.HeightProperty, new Binding(pathHeigthSetting) { Source = settings, Mode = BindingMode.TwoWay });
BindingOperations.SetBinding(win, FrameworkElement.WidthProperty, new Binding(pathWidthSetting) { Source = settings, Mode = BindingMode.TwoWay });
win.Height = (double)height;
win.Width = (double)width;
}
}
catch
{
win.SizeToContent = SizeToContent.WidthAndHeight;
}
return win.ShowDialog();
}
#endregion
}
为了完整性:
<Window x:Class="DialogWindow"
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"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"
WindowStyle="SingleBorderWindow"
WindowStartupLocation="CenterOwner" SizeToContent="WidthAndHeight"
Style="{DynamicResource {x:Type Window}}">
<ContentPresenter x:Name="DialogPresenter" Content="{Binding .}">
</ContentPresenter>
</Window>
public partial class DialogWindow : Window
{
public DialogWindow()
{
InitializeComponent();
this.DialogPresenter.DataContextChanged += DialogPresenterDataContextChanged;
}
private void DialogPresenterDataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
var d = e.NewValue as IDialogResultVMHelper;
if (d == null)
return;
d.RequestCloseDialog += new EventHandler<RequestCloseDialogEventArgs>(DialogResultTrueEvent).MakeWeak(eh => d.RequestCloseDialog -= eh);
}
private void DialogResultTrueEvent(object sender, RequestCloseDialogEventArgs eventargs)
{
this.DialogResult = eventargs.DialogResult;
}
}
public class RequestCloseDialogEventArgs : EventArgs
{
public RequestCloseDialogEventArgs(bool dialogresult)
{
this.DialogResult = dialogresult;
}
public bool DialogResult
{
get; set;
}
}
public interface IDialogResultVMHelper
{
event EventHandler<RequestCloseDialogEventArgs> RequestCloseDialog;
}
首先是一个问题,另一个是违反直觉的问题。 打开新窗口动作与MVVM有什么关系?
我个人认为根本没有任何联系。 实际上,就像其他几个UI构造一样,它完全在View层中发生。 还有其他一些类似的概念,
Next
按Next
)以切换到下一页 所有这些都是向用户显示新视图的不同方式。 仅通过显示绑定到ViewModel的新UI元素,所有这些元素都存在于View层中。
但是...围绕MVVM发展了很多模式来支持这一点。 通常,这是使用服务或控制器来处理视图操作,请检查所选的MVVM库是否支持显示新视图的方法。
最后,让我感到困惑的一件事是,当您需要执行操作并更改视图时发生了什么。 通常,您会将UI对象(例如按钮)绑定到ViewModel级别的命令以执行操作,然后依靠绑定来更新显示新值的UI控件。 由于ViewModel不应该了解View,因此任何更改UI的操作都只能在View中进行。 这意味着您无法绑定到ViewModel命令。 幸运的是,您可以在视图级别创建一个命令,该命令委派给视图模型级别的操作并更改UI。
(嗯...回读,不确定是否能回答问题,但这可能有助于阐明您的想法)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.