绑定到对象

时间:2018-04-23 14:04:24

标签: c# wpf prism

我有一个简单的Person模型:

public class Person
{       
    public string FirstName { get; set; }
    public DateTime LastUpdated { get; set; }
}

假设我有一个带有TextBox的View,它绑定到LastUpdated字段:

<TextBox Grid.Column="1" Margin="5" Text="{Binding Person.FirstName}"/>

现在我需要以某种方式实现PropertyChanged。让我们使用Prism Snippet。 我需要的是在Person类上执行SetProperty:

private Person person;
public Person Person
{
  get { return person; }
  set { SetProperty(ref person, value); }  
}

而不是Person类中的LastUpdated字段:

private DateTime? lastUpdated;
public DateTime? LastUpdated
{
   get { return lastUpdated; }
   set { SetProperty(ref lastUpdated, value); }
}

这不是模型中依赖性的问题。我通过DataContract(WCF服务)得到了模型,所以我无法改变它。那么有没有办法观察类的变化并将类字段绑定到某个UI控件。

2 个答案:

答案 0 :(得分:1)

如果您正在使用Prism,那么您可能正在使用MVVM模式。如果是这样,那么一种方法是使用视图模型进行绑定。不要将Person公开为属性,而是公开要绑定的各个属性 - FirstNameLastUpdated

  • 在视图模型上创建一个属性,用于将调用转发给模型。
  • 将您的视图绑定到视图模型属性。
  • 您可以在视图模型中自由实施更改通知。

答案 1 :(得分:1)

  

有没有办法观察类的变化并将类字段绑定到某个UI控件。

没有。您需要为实际绑定到的属性的对象引发PropertyChanged事件。

如果从某些第三方服务获得Person对象,您无法修改代码以在PropertyChanged属性的setter中引发FirstName事件,则不应该绑定到这些对象。

相反,您应该创建自己的视图模型类并绑定到此视图模型类。视图模型可以简单地包装WCF类,例如:

public class PersonViewModel
{
    private readonly Person _person;
    public PersonViewModel(Person person)
    {
        _person = person;
    }

    public string FirstName
    {
        get { return _person.FirstName; }
        set { _person.FirstName = value; RaisePropertyChanged(); }
    }
}