使用WPF(MVVM,MVVM Light,Fody PropertyChanged),实体框架6.1.3。
我有以下型号。
// The INotifyPropertyChanged is generated by Fody.
public class Person : INotifyPropertyChanged
{
public string Name { get; set; }
// Assume that INotifyPropertyChanged is properly implemented.
}
以下通用抽象视图模型:
public abstract class ViewModel<T> where T : class, new()
{
public T Entity { get; set; }
// Entity Framework repository (add, get, find, delete...)
internal abstract IRegister<T> EntityRegister { get; set; }
}
人物视图模型:
public class PersonViewModel : ViewModel<Person>
{
// Person specific implementations...
...
}
一个简单的WPF文本框绑定到Entity.Name
属性。
<TextBox Text="{Binding Entity.Name,
UpdateSourceTrigger=PropertyChanged,
Mode=TwoWay}" />
问题:
每当我在视图模型中加载(查找)实体时,例如:
Entity = EntityRegister.Find(10); // The Entity primary key.
UI未使用新加载的实体进行更新,我发现很多帖子建议使用PropertyChanged
或null
参数调用string.Empty
来引发PropertyChanged
事件适用于所有物业。
由于我使用Fody的PropertyChanged,INotifyPropertyChanged仅在运行时注入我的模型中,因此我必须动态调用它。
dynamic entity = Entity;
entity.OnPropertyChanged(string.Empty);
我也曾尝试过反思:
var method = typeof(T).GetMethod("OnPropertyChanged");
method.Invoke(Entity, new object[] { string.Empty });
它们都没有例外地运行,但它们什么都不做,UI绑定永远不会刷新,我做错了什么?文本框刷新的唯一方法是当我将其聚焦并按下一个键时,文本框的值将被刷新。
感谢。
答案:
不是为OnPropertyChanged
对象的每个属性调用Entity
,而只需为整个OnPropertyChanged
对象调用Entity
。
OnPropertyChanged("Entity");
简单,用整个Entity
对象更新UI。更简单,更简单。
答案 0 :(得分:1)
UI未更新实体属性的原因是因为视图无法识别它们已更改,因为实体属性本身尚未告知UI它已经改变。 (我希望这是有道理的)
如果您要设置这样的实体:
Entity = EntityRegister.Find(10);
然后,您必须在视图模型中的INotifyPropertyChanged
属性上实现Entity
。