在WPF中将属性公开给数据绑定

时间:2011-01-18 16:05:07

标签: wpf binding dependency-properties

这是我的情景。我有一个带有标准int属性的内部类。

public class Session : INotifyPropertyChanged {
    public event PropertyChangedEventHandler PropertyChanged;

    private ushort _Level;
    public ushort Level
    {
        get { return _Level; }
    }

    private void OnPropertyChanged(string name)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(name));
    }

    // a timer code here updates the _Level property every 60 seconds
    // and calls OnPropertyChange("Level");
}

在我的UI窗口中,我有一个绑定到Session实例的标签,并显示Level值。

 <TextBlock Name="LevelTextBlock" Text="{Binding SessionInstance.Level, StringFormat='0%'}" />

窗口构造函数有以下代码:

 public MyWindow()
    {
        SessionInstance = new Session();

        this.InitializeComponent();
    }

    public Session SessionInstance { get; set; }

但是,正如您可以猜到的,当我更新_Level的值时,UI不会更新文本块。在Session类中添加DependancyProperty是不可接受的。我可以在窗口上执行此操作,但是我仍然需要通知程序来检查返回到Session实例的值。 我想知道是否有这样做的优雅方式。我想不出任何东西,除了在窗口中运行另一个计时器来检查和刷新文本块值。 有什么想法吗?

2 个答案:

答案 0 :(得分:4)

实施INotifyPropertyChanged。甚至还有一个tool可以自动为您的所有属性(或只有属性标记的属性,它是相当可配置的)。

如果您不需要任何其他功能(值继承,绑定来自属性等),则DependencyProperty是过度的,它最好用于控件属性,而不是模型属性。

编辑:

正确实施它看起来像这样:

private string familyName;
public string FamilyName
{
    get { return familyName; }
    set 
    {
        if (value != familyName)
        {
            familyName = value;
            OnPropertyChanged("FamilyName");
        }
    }
}

答案 1 :(得分:0)

您是否从属性设置器调用了OnPropertyChanged?这真的是它所属的地方。