Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF-使用ViewModelLocator模式时从UserControl ViewModel关闭窗口_C#_Wpf - Fatal编程技术网

C# WPF-使用ViewModelLocator模式时从UserControl 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

我有一个WPF应用程序,在其中我使用Windows来容纳用户控件,其中包含所有实际控件,并且ViewModels完成所有实际工作。换句话说,Windows除了作为我的用户控件的图形容器之外,什么都不做(我相信这是一个好的实践?)。我使用ViewModelLocator模式将视图和ViewModel结合起来,如下所示:

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的引用以订阅该事件呢?