C# WPF-使用ViewModelLocator模式时从UserControl ViewModel关闭窗口
我有一个WPF应用程序,在其中我使用Windows来容纳用户控件,其中包含所有实际控件,并且ViewModels完成所有实际工作。换句话说,Windows除了作为我的用户控件的图形容器之外,什么都不做(我相信这是一个好的实践?)。我使用ViewModelLocator模式将视图和ViewModel结合起来,如下所示:C# WPF-使用ViewModelLocator模式时从UserControl ViewModel关闭窗口,c#,wpf,C#,Wpf,我有一个WPF应用程序,在其中我使用Windows来容纳用户控件,其中包含所有实际控件,并且ViewModels完成所有实际工作。换句话说,Windows除了作为我的用户控件的图形容器之外,什么都不做(我相信这是一个好的实践?)。我使用ViewModelLocator模式将视图和ViewModel结合起来,如下所示: namespace Frontend { /// <summary> /// Locates and "marries" views to their
namespace Frontend
{
/// <summary>
/// Locates and "marries" views to their corresponding viewmodels,
/// provided they follow the standard naming convention.
/// </summary>
public static class ViewModelLocator
{
public static bool GetAutoWireViewModel(DependencyObject obj)
{
return (bool)obj.GetValue(AutoWireViewModelProperty);
}
public static void SetAutoWireViewModel(DependencyObject obj, bool value)
{
obj.SetValue(AutoWireViewModelProperty, value);
}
// Using a DependencyProperty as the backing store for AutoWireViewModel. This enables animation, styling, binding, etc...
public static readonly DependencyProperty AutoWireViewModelProperty =
DependencyProperty.RegisterAttached("AutoWireViewModel", typeof(bool), typeof(ViewModelLocator), new PropertyMetadata(false, AutoWireViewModelChanged));
private static void AutoWireViewModelChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (DesignerProperties.GetIsInDesignMode(d)) return;
var viewType = d.GetType();
var viewTypeName = viewType.FullName;
var viewModelTypeName = viewTypeName.Replace("View", "ViewModel");
var viewModelType = Type.GetType(viewModelTypeName);
var viewModel = Activator.CreateInstance(viewModelType);
((FrameworkElement)d).DataContext = viewModel;
}
}
}
名称空间前端
{
///
///将视图定位并“结合”到其相应的ViewModel,
///前提是它们遵循标准命名约定。
///
公共静态类ViewModelLocator
{
公共静态bool GetAutoWireViewModel(DependencyObject obj)
{
返回(bool)对象获取值(AutoWireViewModelProperty);
}
公共静态void SetAutoWireViewModel(DependencyObject对象,布尔值)
{
对象设置值(AutoWireViewModelProperty,值);
}
//使用DependencyProperty作为AutoWireViewModel的备份存储。这将启用动画、样式设置、绑定等。。。
公共静态只读从属属性AutoWireViewModelProperty=
DependencyProperty.RegisterAttached(“AutoWireViewModel”、typeof(bool)、typeof(ViewModelLocator)、新PropertyMetadata(false、AutoWireViewModelChanged));
私有静态void AutoWireViewModelChanged(DependencyObject d、DependencyPropertyChangedEventArgs e)
{
if(DesignerProperties.GetIsInDesignMode(d))返回;
var viewType=d.GetType();
var viewTypeName=viewType.FullName;
var viewModelTypeName=viewTypeName.Replace(“视图”、“视图模型”);
var viewModelType=Type.GetType(viewModelTypeName);
var viewModel=Activator.CreateInstance(viewModelType);
((FrameworkElement)d).DataContext=viewModel;
}
}
}
使用此模式可以使视图和viewmodel自行排序,这很好,但我没有任何来自viewmodel的视图引用,因此现在我希望能够单击用户控件中的按钮并关闭包含它的窗口
我使用RelayCommand
和Binding
执行命令
是否有比使用
var window=Application.current.Windows[0]更好的方法关闭当前窗口
获取当前打开窗口的引用,然后将其关闭?您可以使用RelayCommand
,这是否回答了您的问题@帕夫拉尼霍斯基,对不起,没有。我将编辑我的问题来解释原因。真的是我的疏忽。为了不破坏MVVM,从viewmodel调用一个事件怎么样,窗口将订阅该事件?@corentpane,但是我如何获得对UserControlViewModel的引用以订阅该事件呢?