数据绑定在WPF中是一个核心概念,含义如下:
当数据变化时,希望控件的显示内容也跟着变化;反之亦然,比如文本控件修改了内容,也希望变量同步变化,因此需要数据绑定。它允许将UI元素与数据源连接起来。本文档记录这个数据绑定的一种实现过程。
一、实现过程描述
1.数据类实现INotifyPropertyChanged接口:
2.在XAML中,使用Binding语法将UI元素绑定到该类的属性;比如:
TextBox使用双向绑定(UpdateSourceTrigger=PropertyChanged}
3. 在窗口的代码中,设置DataContext为该数据模型的实例
这样,当数据变化时(即使是多线程中修改了数据),控件中的显示也会变化。并没有报winform中常见的非UI线程更新UI控件的报警问题。
二、实际代码
<StackPanel>
<TextBlock Text="{Binding Name}" FontSize="20" Margin="0,0,0,10"/>
<TextBox Text="{Binding Name,UpdateSourceTrigger=PropertyChanged}" Margin="0,10,0,10"/>
<Button x:Name="btnModfiyName" Content="修改名字" Click="btnModfiyName_Click" Padding="10,5"/>
<Button x:Name="btnThreadModfiyName" Content="线程修改名字" Click="btnThreadModfiyName_Click"/>
</StackPanel>
public class Person : INotifyPropertyChanged
{
private string _name;
public string Name
{
get => _name;
set
{
_name = value;
OnPropertyChanged(nameof(Name));
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
public partial class Window1 : Window
{
private Person _person = new Person { Name = "张三" };
public Window1()
{
InitializeComponent();
DataContext = _person;
}
private void btnModfiyName_Click(object sender, RoutedEventArgs e)
{
_person.Name = "李四";
}
private void btnThreadModfiyName_Click(object sender, RoutedEventArgs e)
{
new TaskFactory().StartNew(() =>
{
_person.Name = "王五";
});
}
}