我正在尝试实现数据绑定,并且在点击某个按钮后让TextBox的文本更新。
XAML:
<TextBox Text="{Binding Path=Output}" />
代码:
public MainWindow()
{
InitializeComponent();
DataContext = Search;
Search.Output = "111";
}
public SearchClass Search = new SearchClass();
private void button1_Click(object sender, RoutedEventArgs e)
{
Search.Output = "222";
}
public class SearchClass
{
string _output;
public string Output
{
get { return _output; }
set { _output = value; }
}
}
当我执行程序时,我看到“111”,因此MainWindow()的绑定有效,但是如果我单击一个按钮 - TextBox中的文本没有更新(但在调试器中我看到button1_Click被执行和Search.Output现在等于“222”)。我做错了什么?
答案 0 :(得分:3)
您应该在INotifyPropertyChanged
中实施SearchClass
,然后在setter中提升事件:
public event PropertyChangedEventHandler PropertyChanged = delegate { };
public string Output
{
get { return _output; }
set
{
_output = value;
PropertyChanged(this, new PropertyChangedEventArgs("Output"));
}
}
如果我理解正确,SearchClass
是您DataContext
的{{1}}。在这种情况下,如上所述实施将有所帮助。
当WPF将某个类视为Binding的源时 - 它会尝试将其强制转换为TextBlock
并订阅INotifyPropertyChanged
事件。当引发事件时 - WPF更新与发送者关联的绑定(PropertyChanged
的第一个参数)。它是使绑定工作顺利进行的主要机制。
答案 1 :(得分:1)
您必须在SearchClass类上实现INotifyPropertyChanged接口。这是粘合剂值通知其源值已更改的方式。它显示“111”值,因为它尚未布置(或多或少),但在此之后将不会更新,直到您实现该接口为止。