从绑定中刷新文本框

时间:2015-01-28 20:28:02

标签: c# wpf windows-mobile

我正在开发包含几页的Windows 8.1应用。特别是一个页面有一个绑定到静态资源的文本框,以便可以在页面之间共享它。当我在文本框中编辑文本时,我能够成功地实时更新该静态资源,但我似乎无法让它以相反的方式工作。我希望能够以编程方式更改绑定指向的字符串,并使文本框立即反映出来。

我的静态资源是我设置用于测试的简单datacontext类:

public class HubDataContext : INotifyPropertyChanged
{
    private string firstNameTextBox;
    public string FirstNameBoxText
    {
        get { return firstNameTextBox; }
        set
        {
            firstNameTextBox = value;
            InvokePropertyChanged(new PropertyChangedEventArgs("FirstName"));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void InvokePropertyChanged(PropertyChangedEventArgs e)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, e);
    }
}

要测试我是否能够这样做,我在页面上添加了一个按钮,用于修改文本框绑定的字符串:

((HubDataContext)this.mainHubSection.DataContext).FirstNameBoxText = "TEST!";

如果按下按钮,datacontext的FirstNameBoxText会更新,但文本框不会反映这些更改,直到我导航到其他页面然后导航回来。

我还可以修改文本框中的文本,然后导航并返回以显示我的更改已反映出来。基本上我希望能够立即看到对文本框绑定的字符串所做的任何更改,而无需先离开页面。

文本框本身的代码是:

 <TextBox x:Name="FirstNameBox" HorizontalAlignment="Left" Height="65" Margin="127,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="327" PlaceholderText="" Header="First Name" DataContext="{StaticResource GlobalDataContext}" Text="{Binding FirstNameBoxText, Mode=TwoWay, Source={StaticResource GlobalDataContext}}"

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:3)

使用PropertyChanged事件时,应使用属性名称。绑定使用属性名称作为键。你会看到,在举起事件之后,你可以在属性设置器中放置一个断点。

public class HubDataContext : INotifyPropertyChanged
{
    private string firstNameTextBox;
    public string FirstNameBoxText
    {
        get { return firstNameTextBox; }
        set
        {
            firstNameTextBox = value;
            InvokePropertyChanged(new PropertyChangedEventArgs("FirstNameBoxText"));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void InvokePropertyChanged(PropertyChangedEventArgs e)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, e);
    }
}