如何在属性更改时使用RaisePropertyChanged?

5

我在我的视图模型中添加了一个模型:

public dal.UserAccount User  {
  get
  {
    return _user;
  }
  set
  {
    _user = value;
    RaisePropertyChanged(String.Empty); 
   }
}
                

我处理属性更改事件...
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string propertyName)
{
  if (this.PropertyChanged != null)
    this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
        
        

这是我使用的绑定:

<TextBox Text="{Binding User.firstname, Mode=TwoWay, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" />
    
    

为什么在更新视图时不触发propertychange事件?

1
你必须将变量名发送到其参数,而不是 string.Empty。你可以将你的 RaisePropertyChanged 方法原型化为 void RaisePropertyChanged([CallerMemberName] string propertyName = null),并向其中发送无参数,这样你的调用者名称将被用作参数值。 - Stas BZ
2个回答

13

PropertyChanged被用于通知UI模型中的某些内容已经被更改。由于您正在更改对象的User属性的内部属性,因此User属性本身没有更改,因此PropertyChanged事件没有被触发。

第二个问题 - 您的Model 应该实现INotifyPropertyChanged接口。换句话说,确保UserAccount实现了INotifyPropertyChanged,否则更改firstname也不会影响视图。

还有一件事:

参数RaisePropertyChanged应该接收已更改的属性的Name。所以在您的情况下:

Change:
RaisePropertyChanged(String.Empty);

为了
RaisePropertyChanged("User");

来自MSDN:

当在 PropertyChangedEventArgs 中使用 null 或 String.Empty 作为属性名时,PropertyChanged 事件可以指示对象上的所有属性都已更改。

(如果是这种情况,则无需刷新所有属性)

您可以在 这里 阅读更多有关PropertyChanged概念的内容。


我已经尝试过了,但是在视图中文本框绑定的是User.firstname,所以不起作用。 - A.T.
传递空字符串或 null 将通知视图模型的所有属性已更改... 我这么认为... - A.T.
实际上,我正在尝试通知用户模型中的名字,这是在我的VM中引用的...但是我无法弄清楚问题出在哪里? - A.T.
也许我错了,但我需要根据我的模型进行检查。 - A.T.
正如我所说,它是用户的内部属性,因此不会调用用户的setter方法... - Blachshma
显示剩余2条评论

1
你可以从另一个类中调用属性更改事件。如果您拥有所有源代码,则并不特别有用。对于闭源代码,可能会有所帮助。尽管我认为它是实验性的,而不是生产就绪的。
请参阅此控制台复制粘贴示例:
using System;
using System.ComponentModel;
using System.Runtime.InteropServices;

namespace ConsoleApp1
{
    public class Program
    {
        static void Main(string[] args)
        {
            var a = new A();
            a.PropertyChanged += A_PropertyChanged;
            var excpl = new Excpl();
            excpl.Victim = a;
            excpl.Ghost.Do();
        }

        private static void A_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            Console.WriteLine("Event triggered");
        }
    }

    [StructLayout(LayoutKind.Explicit)]
    public struct Excpl
    {
        [FieldOffset(0)]
        public A Victim;
        [FieldOffset(0)]
        public C Ghost;
    }

    public class A : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
    }

    public class C : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public void Do()
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(""));
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接