gpt4 book ai didi

.net - DependencyProperty VS 无冗余状态管理

转载 作者:行者123 更新时间:2023-12-05 00:54:07 25 4
gpt4 key购买 nike

让我们假设我们有一个只有一个状态变量的简单 UI。此状态表示为枚举值,例如。 Phase1、Phase2 等。根据 UI 处于哪个状态(阶段),不同的 UI 元素、窗口应该是可见的还是隐藏的。

代码如下:

public enum Phases { Phase1, Phase2, Phase3 }

public class UIStateModel : DependencyObject
{
public static DependencyProperty CurrentStateProperty =
DependencyProperty.Register("CurrentStateProperty",
typeof(Phases),
typeof(UIStateModel));
public Phases CurrentState
{
get { return (Phases)GetValue(CurrentStateProperty); }
set { SetValue(CurrentStateProperty, value); }
}
public Visibility Window1Visible // Databound to Window1.Visibility
{
get
{
if (this.CurrentState == Phases.Phase1) return Visibility.Visible;
else return Visibility.Hidden;
}
}
public Visibility Window2Visible // Databound to Window2.Visibility
{
get
{
if (this.CurrentState == Phases.Phase2) return Visibility.Visible;
else return Visibility.Hidden;
}
}
...
}

问题是与上述代码的数据绑定(bind)不起作用,因为 WindowXVisible 属性不是 DependencyProperty-s。如果我将所有属性都转换为 DependencyProperty,那么我将在状态管理中引入冗余。除了保持一切同步的额外负担外,它甚至会变得不一致(如果我同步不好)。

避免在 UI 状态管理中引入冗余,但仍然利用 DependencyProperty-s 促进的数据绑定(bind)功能的正确方法是什么?

最佳答案

您可以使用 INotifyPropertyChanged .只需在 CurrentState 更改时为给定的 WindowXVisible 发送更改通知(为此 DP has a callback)。

绑定(bind)通常可以通过 DependencyProperty 或 INotifyPropertyChanged 通知(与 DP 不同,必须手动发送)来监听更改。

您可以使用 this tool自动生成通知调用(不会增加代码的复杂性)。它甚至可以出色地处理此类重要情况。

编辑:

将其注册到 CurrentStateProperty 的 PropertyMetadata 中。

    private static void OnCurrentStateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
this.OnPropertyChanged("CurrentState");
this.OnPropertyChanged("Window1Visible");
this.OnPropertyChanged("Window2Visible");
}

OnPropertyChanged 只是调用 PropertyChanged 事件,并将此作为发送者并将字符串作为属性名称。

这将导致 Window1Visible 和 Window2Visible 绑定(bind)更新并获取新值。

顺便说一下,你应该想出比 Window1 和 WIndow2 更好的名字。

关于.net - DependencyProperty VS 无冗余状态管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5747899/

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