我怎样才能对房产变更进行RaisePropertyChanged?

时间:2013-03-06 11:26:48

标签: wpf event-handling bind

这里我向我的viewmodel添加了一个模型......

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事件?任何人都可以告诉我我做错了什么......

2 个答案:

答案 0 :(得分:8)

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

第二 - 您的模型should implement the INotifyPropertyChanged interface。 - 换句话说,确保UserAccount实现INotifyPropertyChanged,否则更改firstname也不会影响视图。

另一件事:

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

变化:
  RaisePropertyChanged(String.Empty);


 RaisePropertyChanged("User");

来自MSDN

  

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

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

您可以详细了解 PropertyChanged here

的概念

答案 1 :(得分: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(""));
        }
    }
}