【问题标题】:Bind Button.IsEnabled to a property in a TextBox's data source将 Button.IsEnabled 绑定到 TextBox 数据源中的属性
【发布时间】:2026-02-10 13:25:01
【问题描述】:

我有一个Foo 类:

public class Foo
{
    public string Value { get; set; }
    public string IsDirty { get; private set; }
}

我有一个带有TextBoxButton 绑定到Foo 的xaml:

<TextBox Text="{Binding Value, UpdateSourceTrigger=PropertyChanged}" ... />
<Button IsEnabled="{Binding IsDirty}" ... />

一旦TextBox 中的文本发生更改(在KeyDown 上更新),Foo.IsDirty 就会变为真(直到单击保存按钮)。

现在,Button.IsEnabled 不会随着 Foo.IsDirty 的变化而变化。

如何更改Button 上的绑定,以便在Foo.IsDirty = true 时启用它,反之亦然?

谢谢!

【问题讨论】:

    标签: wpf xaml data-binding binding


    【解决方案1】:

    你需要在你的 Foo 类中实现接口 INotifyPropertyChanged:

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string name)
      {
          PropertyChangedEventHandler handler = PropertyChanged;
          if (handler != null)
          {
              handler(this, new PropertyChangedEventArgs(name));
          }
      }
    
    
    private bool _isDirty;
    
    public bool IsDirty { get{ return _isDirty;}
                          private set{
                              _isDirty= value;
                              OnPropertyChanged("IsDirty"); }
                        }
    

    【讨论】:

    • 我担心这可能是问题所在。不幸的是, Foo 类扩展了一个属于我无法修改的框架的一部分的类(并且 IsDirty 是框架的一部分),所以如果该属性没有通知我想我将不得不找出其他的东西。谢谢!
    • 为什么不创建一个从您的基类和INotifyPropertyChange 扩展的类,并让Foo 从那里继承?
    • 如果您可以更新Value 属性的设置器的代码,那么您可以在Value 属性的设置器中提高OnPropertyChanged("IsDirty");