文本框的文本更改时无法更新静态绑定属性的值

Can't update the static bound property's value when text box's text changes

我有以下标记。

<TextBox x:Name="Address" 
         Text="{Binding 
                  Source={x:Static local:MainWindow.Boundie},
                  Path=SomeProp,
                  Mode=TwoWay}">
</TextBox>

在后面的代码中,我有一个这样的静态属性。

Boundie = new Something { SomeProp = "old" };

static Something Boundie { get; set; }

public class Something { public String SomeProp { get; set; } }

我原以为如果我在数据绑定文本框和断点中键入 "new",该属性的特性将会改变。事实并非如此。我使用 Mode 的方式有误吗?或者除了将其设置为 TwoWay 之外,我还需要做任何其他事情吗?或者这种方法在这种情况下是不合适的?

您的 .xaml 应如下所示:

<TextBox x:Name="Address" 
     Text="{Binding Path=Boundie.SomeProp, Mode=TwoWay}">
</TextBox>

您的 .cs 应如下所示:

public class YourClass : INotifyPropertyChanged
{

    private Boundie _boundie;

    // You need Boundie to be public
    public Boundie 
    { 
        get; 
        set
        {
             _boundie = value;
             OnPropertyChanged("Boundie");
        } 
    }

    public Main()
    {
        Boundie = new Something { SomeProp = "old" };

        // Initialize component AFTER you initialized your attribute
        InitializeComponent();
        DataContext = this;
    }

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

注意:您的 Boundie 属性 (SomeProp) 必须是 public。

如果您只需要更新 GUI 数据对象,实施 INotifyPropertyChanged 不是强制性的。 正如 Sonhja 所建议的那样,将 Boundie 属性 初始化放在正确的位置很重要。 因此,您应该在静态构造函数中或在 InitializeComponent(); 调用之前(在 public 构造函数中)插入 Boundie = new Something { SomeProp = "old" };

原因很简单:如果您 Boundie = new Something { SomeProp = "old" }; 调用 InitializeComponent(); 之后,绑定已经尝试读取 Boundie 属性值(此时为空)。