目录
WPF通过资源绑定可以省略很多属性变更交互的代码。
1.属性变更事件
属性变更时通知窗体进行更新,需要设置属性变更事件。类需要继承INotifyPropertyChanged接口,然后创建PropertyChangedEventHandler属性变更委托,并调用属性变更函数。
public class AutoSampleName : INotifyPropertyChanged
{
/// <summary>
/// 实现接口
/// </summary>
public event PropertyChangedEventHandler PropertyChanged;
/// <summary>
/// 属性变更事件
/// </summary>
/// <param name="Path">事件源</param>
public void OnPropertyChanged([CallerMemberName] string propertyName = "")
{
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
INotifyPropertyChanged接口需要引用:
using System.ComponentModel;
[CallerMemberName] string propertyName = "" 是对方法名的调用方式,支持调用方法的时候自动获取出发事件的方法属性的名称作为参数。需要添加引用:using System.Runtime.CompilerServices;
属性变更时,在set访问器中调用属性变更事件。
public bool IsEnabled
{
get { return isEnabled; }
set
{
isEnabled = value;
OnPropertyChanged();
}
}
2.ICommand接口
ICommand可用于实现Xaml和后台代码的方法绑定。
/// <summary>
/// Base command class.
/// </summary>
/// <remarks>通过事件委托,以便跨线程调用</remarks>
public class BaseCommand : ICommand
{
/// <summary>
/// Event handler
/// 事件出发时先调用CanExecute(),然后调用
/// </summary>
public event EventHandler CanExecuteChanged;
/// <summary>
/// Execute action.
/// </summary>
public Action<object> DoExecute { get; set; }
/// <summary>
/// Canexecute method.
/// </summary>
public Func<object, bool> DoCanExecute { get; set; } = new Func<object, bool>(obj => true);
/// <summary>
/// Can execute.
/// </summary>
/// <param name="parameter"></param>
/// <returns></returns>
public bool CanExecute(object parameter)
{
//初始化时会调用一次
return DoCanExecute?.Invoke(parameter) == true;
}
/// <summary>
/// Excute.
/// </summary>
/// <param name="parameter"></param>
public void Execute(object parameter)
{
//实例化委托。
DoExecute?.Invoke(parameter);
}
/// <summary>
/// 执行委托,调用CanExecute。
/// </summary>
public void DoCanExecuteChanged()
{
CanExecuteChanged?.Invoke(this, EventArgs.Empty);
}
}
3.ComboBox数据绑定
<ComboBox ItemsSource="{Binding GenoTypeList}" DisplayMemberPath="MainGenotype" SelectedValuePath="ID" SelectedItem="{Binding SelectedGenotype}" Text="{Binding SelectedGenotype.MainGenotype}" />
Xaml绑定数据时,若单独绑定ItemsSource,会发生后台更新SelectedItem后,但是UI界面并没有更新具体的数据。
需要同时绑定Text数据,才能正常更新数据。
数据绑定时,它可以通过“类.属性”的方法绑定某一个类的具体属性。
4.绑定到自身控件
通过Self关键字可以绑定自身的控件。
CommandParameter="{Binding Self}"
如上,在Button的CommandParameter中绑定Self,则后台收到的参数就是Button自身。
5. 绑定到自身绑定的数据
CommandParameter="{Binding}"
CommandParameter="{Binding .}" //使用.代表自身源
如上,只写Bingding而不添加其他的任何参数,将会绑定到当前控件所绑定的数据源。
比如在在Button的CommandParameter中绑定{Binding},Button本身绑定了Person类,Content属性绑定了Person的Name属性,则此时后台接收到的参数将是当前的Person类。
6.绑定到DataContext绑定的ViewModel的属性
Command="{Binding DataContext.AddCommand
,RelativeSource={RelativeSource AncestorType=MyWindow}}"
此处需要注意,绑定的对象需要使用“DataContext.”+ViewModel中的属性的形式,不然将无法获取到正确的目标。