2013-03-06 262 views
3

这里我添加了一个模型,我的ViewModel ...我怎样才能RaisePropertyChanged属性更改?

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事件不会触发更新视图?任何人都可以告诉我我做错了什么...

+0

你必须把你的变量名,以它的参数,而不是'string.Empty'。你可以将你的'RaisePropertyChanged'方法原型设为'void RaisePropertyChanged([CallerMemberName] string propertyName = null)',并且不向其发送参数,所以你的调用者名称将被用作参数值。 – 2016-04-19 11:31:08

回答

7

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

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

另一件事:

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

变化:
RaisePropertyChanged(String.Empty);


RaisePropertyChanged("User");

MSDN

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

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

你可以阅读更多的概念的PropertyChangedhere

+0

我这样做,但这不工作,因为在文本框中绑定为User.firstname ... – 2013-03-06 11:33:02

+0

是的,我补充说:) – 2013-03-06 11:36:44

+0

请阅读我更新的答案 – Blachshma 2013-03-06 11:37:14

0

您可以从另一个类中调用一个属性更改事件。如果您拥有所有资源,则不是特别有用。对于封闭的来源,它可能是。虽然我不认为它是实验性的,而不是生产准备。

看到这个控制台复制粘贴例如:

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("")); 
     } 
    } 
}