WPF数据绑定 - 中间对象未被命中的Getter / Setter

时间:2017-02-22 23:54:53

标签: c# wpf xaml data-binding

  1. 我的WPF TextBox使用类实例(称为“SelectedDocument”)作为其datacontext。该类实现了INOtifyPropertyChanged。
  2. SelectedDocument实例拥有另一个类型为“CellContent”的对象(名为“Description”),通过属性公开。
  3. CellContent还实现了INotifyPropertyChanged。
  4. CellContent类具有可绑定的字符串属性(“TextValue”)。
  5. 我将TextBox的Text属性绑定到TextValue属性。像这样:

    <TextBox DataContext="{Binding SelectedDocument}" Text="{Binding Path=Description.TextValue" />
    
  6. 数据绑定没有问题 - 它可以双向工作。但是为了使绑定工作,WPF可能每次都要在SelectedDocument中点击Description属性来检索CellContent对象:

    public CellContent Description
    { get; set; }
    

    (我的代码中此属性更复杂。)然后 WPF可以到达实际的CellContent对象内部并获取/设置TextValue。

    问题:描述属性永远不会被命中。看起来WPF正在绕过它,并且已经创建了与Description对象内部的TextValue属性的直接连接。 我想每次点击描述获取器和设置器,以便我可以在那里执行一些额外的代码。

    我该怎么做?

2 个答案:

答案 0 :(得分:2)

如果您希望在更改子项的属性时将Document标记为脏,则可以订阅该子项的PropertyChanged事件。

我假设您的CurrentDocument看起来像这样。

public class Doc
{
    public Doc()
    {
        _description = new CellContent();
       // subscribe to changes in child
        _description.PropertyChanged += DescriptionChanged; 
    }

    private void DescriptionChanged(object sender, PropertyChangedEventArgs e)
    {
        Debug.Write($"I'm a dirty dirty document. Property {e.PropertyName} has changed");
    }

    private CellContent _description;
    public CellContent Description
    {
        get
        {
            Debug.Write("I assure you this is called every time a getter of the child properties is called");
            return _description;
        }
        // If you have a setter, don't forget to -= unsubscribe and resubscribe += after changing
    }
}

答案 1 :(得分:0)

每次更改PropertyChanged属性时,请尝试为“描述”引发TextValue事件。