当文本框的文本发生变化时,无法更新静态绑定属性的值

时间:2015-01-08 10:32:40

标签: c# wpf xaml data-binding

我有以下标记。

<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”,属性的属性就会改变。事实并非如此。我用错误的方式使用模式吗?或者除了将其设置为 TwoWay 之外,我还需要做其他任何事情吗?或者这种方法在这种情况下是否合适?

2 个答案:

答案 0 :(得分:1)

您的.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)必须是公开的。

答案 1 :(得分:1)

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

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