gpt4 book ai didi

.net - MVVM 窗口/控件操作

转载 作者:行者123 更新时间:2023-12-02 07:13:24 26 4
gpt4 key购买 nike

我正在构建一个 WPF MVVM 应用程序,我想保留我能符合 MVVM 的部分(我知道有些东西是过度设计的,尽管在这里尽最大努力)。

我遇到了一个小难题,我需要根据 View 模型中方法中的一些逻辑隐藏/关闭窗口。

我一辈子都想不出一个可靠的方法来做到这一点。我已将 Visibility 属性绑定(bind)到窗口的 Visibility DP,它可以正常工作(有点),但我如何在对话框中调用 Close()

我正在使用 View-First MVVM,因此 View 模型不知道 View , View 实例化 View 模型(通过 DI/IoC)并将其设置为 DataContext。

命令以错误的方式工作,事件是不可能的,除非我在代码中绑定(bind)到它,如果有一种不完全复杂的 MVVM 方式来做到这一点,我宁愿不这样做。

来自更大的 SO 社区的任何想法?

或者我可能遗漏了一些关于 MVVM 的一般信息?不管怎样,请告诉我 :o

最佳答案

通常情况下,有很多方法可以给这只猫剥皮。

在 View 中没有代码隐藏的情况下执行此操作的一种方法是使用附加行为,例如:

public static class CloseBehavior 
{
public static bool GetCloseWhen(DependencyObject obj)
{
return (bool)obj.GetValue(CloseWhenProperty);
}

public static void SetCloseWhen(DependencyObject obj, bool value)
{
obj.SetValue(CloseWhenProperty, value);
}

public static readonly DependencyProperty CloseWhenProperty =
DependencyProperty.RegisterAttached(
"CloseWhen", typeof(bool), typeof(CloseBehavior),
new UIPropertyMetadata(OnCloseWhenChanged));
// the lone parameter in the UIPropertyMetadata is a callback
// for when the property value changes

static void OnCloseWhenChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
// if false, we're not concerned with it
if(!(bool)e.NewValue) return;

// if attached to something other than a window, this doesn't make sense
var win = d as Window;

if(d == null) return;

// close the window
win.Close();
}
}

在您的 XAML 中:

<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"

local:CloseBehavior.CloseWhen="{Binding ViewModelWorkComplete}"
>
<! -- content -->
</Window>

ViewModelWorkComplete 只是 View 模型中的 bool 属性。

效果是,当 View 模型将 ViewModelWorkComplete 设置为 true(并引发相应的 INotifyPropertyChanged 事件)时,窗口将关闭。

关于.net - MVVM 窗口/控件操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3578942/

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