使用场景,UI绑定一个模型的一个属性,属性的改变也触发界面上的绑定值的改变。一般绑定属性值的变化要立即触发UI绑定元素的变化,类的属性需要继承INotifyPropertyChanged。

如 Name1, 输入完成,失去焦点时,才触发其它绑定的改变。将触发方式改为UpdateSourceTrigger=PropertyChanged, 时,只要有属性值改变,立即触发绑定。Age属性使用相同的绑定方式。
左边输入属性值,右边Copy也跟着变化。
代码如下:
1. 创建绑定触发更改通知的基类
using System.ComponentModel;
using System.Runtime.CompilerServices;
public class BindingBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
2. 创建窗口绑定的显示的数据模型类
public class MainViewModel : BindingBase
{
public MainViewModel() { }
private int age;
public int Age
{
get { return age; }
set
{
age = value;
OnPropertyChanged();
}
}
private string name;
public string Name
{
get { return name; }
set
{
name = value;
OnPropertyChanged();
//OnPropertyChanged(new System.ComponentModel.PropertyChangedEventArgs("Name"));
}
}
}
3. WPF UI窗口创建绑定
后台代码:
namespace WpfAppBindNotify
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new MainViewModel();
}
}
}
前台XAML创建绑定:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<GridSplitter Grid.Column="1" Width="3" Background="LightGreen" ResizeBehavior="PreviousAndNext"/>
<StackPanel Grid.Column="0" Margin="2">
<DockPanel>
<Label DockPanel.Dock="Left">Name1:</Label>
<TextBox x:Name="txt" Margin="2" Text="{Binding Name}"></TextBox>
</DockPanel>
<DockPanel>
<Label DockPanel.Dock="Left">Name2(UpdateSourceTrigger=PropertyChanged):</Label>
<TextBox x:Name="txt2" Margin="2" Text="{Binding Name,UpdateSourceTrigger=PropertyChanged}"></TextBox>
</DockPanel>
<DockPanel>
<Label DockPanel.Dock="Left">Age1:</Label>
<TextBox x:Name="txtAge" Margin="2" Text="{Binding Age}"></TextBox>
</DockPanel>
<DockPanel>
<Label DockPanel.Dock="Left">Age2(PropertyChanged):</Label>
<TextBox x:Name="txtAge2" Margin="2" Text="{Binding Age,UpdateSourceTrigger=PropertyChanged}"></TextBox>
</DockPanel>
</StackPanel>
<StackPanel Grid.Column="2" Margin="2">
<DockPanel>
<Label DockPanel.Dock="Left">Name1_Copy:</Label>
<TextBox x:Name="txtCopy" Margin="2" Text="{Binding Name}"></TextBox>
</DockPanel>
<DockPanel>
<Label DockPanel.Dock="Left">Name2_Copy:</Label>
<TextBox x:Name="txt2Copy" Margin="2" Text="{Binding Name,UpdateSourceTrigger=PropertyChanged}"></TextBox>
</DockPanel>
<DockPanel>
<Label DockPanel.Dock="Left">Age1_Copy:</Label>
<TextBox x:Name="txtAgeCopy" Margin="2" Text="{Binding Age}"></TextBox>
</DockPanel>
<DockPanel>
<Label DockPanel.Dock="Left">Age2_Copy:</Label>
<TextBox x:Name="txtAge2Copy" Margin="2" Text="{Binding Age}"></TextBox>
</DockPanel>
</StackPanel>
</Grid>
网友评论