这里我向我的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事件?任何人都可以告诉我我做错了什么......
答案 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(""));
}
}
}