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 事件?

4

2 回答 2

13

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

其次,您的模型应该实现INotifyPropertyChanged接口。- 换句话说,确保UserAccount实现 INotifyPropertyChanged,否则更改firstname也不会影响视图。

另一件事:

RaisePropertyChanged 应接收的参数是已更改的属性的名称。所以在你的情况下:

改变:
RaisePropertyChanged(String.Empty);


RaisePropertyChanged("User");

来自MSDN

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

(在这种情况下无需刷新所有属性)

您可以在此处阅读有关 PropertyChanged概念的更多信息

于 2013-03-06T11:30:52.897 回答
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(""));
        }
    }
}
于 2017-04-07T10:04:55.523 回答