【问题标题】:Exposing property to databinding in WPF在 WPF 中向数据绑定公开属性
【发布时间】:2011-01-18 16:05:07
【问题描述】:

这是我的场景。我有一个带有标准 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 实例的通知程序。 我想知道是否有优雅的方式来做到这一点。除了在窗口中运行另一个计时器来检查和刷新文本块值之外,我想不出任何东西。 有什么想法吗?

【问题讨论】:

    标签: wpf binding dependency-properties


    【解决方案1】:

    实现INotifyPropertyChanged。甚至还有一个 tool 可以为您的所有属性自动执行此操作(或仅由属性标记的属性,它是相当可配置的)。

    DependencyProperty 如果你不需要它的任何其他特性(值继承、从属性绑定等)就过分了,它最好用于控件属性,而不是模型属性。

    编辑:

    正确实现如下:

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

    【讨论】:

    • 我添加了这个,但它仍然没有更新。我将编辑原始代码以显示编辑内容。
    • 您要么必须手动调用属性 Level 设置器中的 OnPropertyChanged,要么使用我写过的 NotifyPropertyWeaver(并确保它正确执行 - 它在构建输出日志中添加了几行)。跨度>
    • 我看不到您在哪里设置数据上下文。您需要将数据上下文设置为窗口。 this.DataContext = this;
    • 我有一些辅助代码弄乱了它现在可以正常工作的工作。谢谢大家。
    【解决方案2】:

    您是从属性设置器调用 OnPropertyChanged 吗?这才是真正属于它的地方。

    【讨论】:

    • 这是正确的,但是可以从任何地方调用该事件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 2023-01-10
    • 2013-12-17
    • 2011-02-04
    • 1970-01-01
    • 2022-01-14
    相关资源
    最近更新 更多