gpt4 book ai didi

wpf - 简单的小 INotifyPropertyChanged 实现

转载 作者:行者123 更新时间:2023-12-04 13:41:34 25 4
gpt4 key购买 nike

假设我有以下类(class):

public MainFormViewModel
{
public String StatusText {get; set;}
}

让我对 StatusText 的更改以反射(reflect)到绑定(bind)到它的任何控件的最简单的最小方法是什么?

显然我需要使用 INotifyPropertyChanged,但是有没有一种很酷的方法不会弄乱我的代码?需要很多文件? ETC?

注意:如果这是一个骗局,那么我很抱歉。我搜索并找不到任何东西,但使用 T4 code Generation这听起来并不容易(至少要设置)。

最佳答案

不幸的是,C# 并没有提供一种简单的机制来自动执行此操作……它是 suggested创建一个像这样的新语法:

public observable int Foo { get; set; }

但我怀疑它是否会被包含在语言中......

一个可能的解决方案是使用像 Postsharp 这样的 AOP 框架。 ,这样你只需要用一个属性来装饰你的属性:
public MainFormViewModel : INotifyPropertyChanged
{
[NotifyPropertyChanged]
public String StatusText {get; set;}
}

(没有尝试过,但我很确定 Postsharp 允许你做那种事情......)

更新:好的,我设法让它工作。请注意,这是一个非常粗略的实现,使用私有(private)字段上的反射来检索委托(delegate)......当然可以改进,但我会留给你;)
[Serializable]
public class NotifyPropertyChangedAttribute : LocationInterceptionAspect
{
public override void OnSetValue(LocationInterceptionArgs args)
{
object oldValue = args.GetCurrentValue();
object newValue = args.Value;
base.OnSetValue(args);
if (args.Instance is INotifyPropertyChanged)
{
if (!Equals(oldValue, newValue))
{
RaisePropertyChanged(args.Instance, args.LocationName);
}
}
}

private void RaisePropertyChanged(object instance, string propertyName)
{
PropertyChangedEventHandler handler = GetPropertyChangedHandler(instance);
if (handler != null)
handler(instance, new PropertyChangedEventArgs(propertyName));
}

private PropertyChangedEventHandler GetPropertyChangedHandler(object instance)
{
Type type = instance.GetType().GetEvent("PropertyChanged").DeclaringType;
FieldInfo propertyChanged = type.GetField("PropertyChanged",
BindingFlags.Instance | BindingFlags.NonPublic);
if (propertyChanged != null)
return propertyChanged.GetValue(instance) as PropertyChangedEventHandler;

return null;
}
}

请注意,您的类(class)仍然需要实现 INotifyPropertyChanged界面。您只是不必在属性 setter 中显式引发事件。

关于wpf - 简单的小 INotifyPropertyChanged 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3851144/

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