WPF - 更新加载实体的UI /绑定

时间:2016-05-27 00:16:02

标签: c# wpf entity-framework mvvm data-binding

使用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未使用新加载的实体进行更新,我发现很多帖子建议使用PropertyChangednull参数调用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。更简单,更简单。

1 个答案:

答案 0 :(得分:1)

UI未更新实体属性的原因是因为视图无法识别它们已更改,因为实体属性本身尚未告知UI它已经改变。 (我希望这是有道理的)

如果您要设置这样的实体:

Entity = EntityRegister.Find(10);

然后,您必须在视图模型中的INotifyPropertyChanged属性上实现Entity