绑定目标控件在源以编程方式更改时不更新

时间:2014-02-28 05:30:34

标签: c# .net xaml data-binding windows-store-apps

我有2个“文本框”都绑定到源字符串属性“mode = 2way”。当我改变一个文本时,另一个完全改变。但是当我以编程方式更改源字符串时,都不会更新。我无法弄清楚我错过了什么。这是我的代码片段:

Xaml代码:

<StackPanel Orientation="Vertical">
    <StackPanel.DataContext>
        <local:x/>
    </StackPanel.DataContext>
    <TextBox Text="{Binding Text,Mode=TwoWay}" />
    <TextBox Text="{Binding Text, Mode=TwoWay}"/>
</StackPanel>
<Button Content="Reset"  Click="Button_Click"/>

按钮单击处理程序:

private void Button_Click(object sender, RoutedEventArgs e)
{
    obj = new x() { Text="reset success"};
}

对象类:

class x:INotifyPropertyChanged
{
    private string text;
    public string Text
    {
        get { return text; }
        set 
        { 
            text = value;
            OnPropertyChange("Text");
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChange(string propertyName)
    {
        PropertyChangedEventHandler propertyChangedEvent = PropertyChanged;
        if (propertyChangedEvent != null)
        {
            propertyChangedEvent(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

2 个答案:

答案 0 :(得分:1)

<StackPanel x:Name="myStackPanel" Orientation="Vertical">
    <StackPanel.DataContext>
        <local:x/>
    </StackPanel.DataContext>
    <TextBox Text="{Binding Text, Mode=TwoWay}" />
    <TextBox Text="{Binding Text, Mode=TwoWay}"/>
</StackPanel>

上面的XAML摘录意味着:将stackpanel的DataContext设置为类x的新实例。因为实例化是由XAML完成的,所以在从stackpanel的x获取实例之前,您没有引用该DataContext实例。

如果您想测试数据绑定是否有效,则应修改类x的现有实例(当前设置为DataContext)。

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    var currentDataContext = (x)myStackPanel.DataContext;
    x.Text = "reset success";
}

如果您想按照评论中的说明从代码中设置StackPanel的{​​{1}},则会保存以删除XAML中的DataContext设置部分。

答案 1 :(得分:1)

你做了一个新对象。这就是原因。不要只生成一个新对象并更改实际绑定对象的内容(文本)。

创建新对象时,解决方案中的“subcription”将丢失。 :(