勇哥注:
此系列贴子服务于C# winform开发工程师,帮助他们快速了解wpf技术,节省大家的学习成本。
因此,这个系列不是讲给初学者听的。
我们知道winform是C#的标准ui框架,wpf则是另一种ui框架,随着.net Core的流行,它会是今后的主流选择,我们必须学习它。
系列贴子导航:
上节行为绑定还有一个方法和事件没有介绍,本篇继续。
即CanExecute方法和事件CanExecuteChanged。
internal class CommandValue : ICommand { public event EventHandler? CanExecuteChanged; public bool CanExecute(object? parameter) { throw new NotImplementedException(); } public void Execute(object? parameter) { throw new NotImplementedException(); } }
本篇的要求如下:
如果文本框为空,则按钮“读”不可用,否则可用。
首先,我们在文本框的Xaml代码里加点料
<TextBox Name="TxtAddr" Grid.Column="1" HorizontalAlignment="Left" Margin="84,131,0,0" TextWrapping="Wrap" Text="{Binding Value,UpdateSourceTrigger=PropertyChanged}" Foreground="{Binding MyColor}" VerticalAlignment="Top" Width="78"/>
UpdateSourceTrigger=PropertyChanged
当输入时就把数据同步到Value去。
如果不加这句就是:当文本框失去焦点的时候,才把数据同步到Value去。
(因为我们希望文本框输入内容,或者删除内容时立刻就能让按钮变灰或者去灰,所以必须要这种设定)
接下来完成CanExecute函数,以及完成事件的定义。
CanExecute函数的作用如代码注释所讲,它为False则按钮变灰。
这里只是执行了委托OnCanExec,实际执行是到MainViewModel中的isEnable函数中去执行的。
同时,勇哥在这里实现了事件通知函数EventCanExec,在MainViewModel中,当Value值发生变化时,
会调用这个EventCanExec以发起CanExecuteChanged事件的通知。
internal class CommandValue : ICommand { public event EventHandler? CanExecuteChanged; public bool CanExecute(object? parameter) { //绑定了这个命令的按钮是否可用 var res= OnCanExec?.Invoke(parameter)==true; return res; } public void Execute(object? parameter) { //控制逻辑 //此处原意是想写 Value=100,但是此处访问不到Value OnAction?.Invoke(parameter); } public Action<object?> OnAction { get; set; } public Func<object,bool> OnCanExec { get; set; } public void EventCanExec() { CanExecuteChanged?.Invoke(this,new EventArgs()); } }
下面是MainViewModel的定义:
此处在Value属性变化时,执行一句事件通知
(MyCommandValue as CommandValue).EventCanExec();
通知后按钮就会变灰或者去灰。
public class MainViewModel:INotifyPropertyChanged { private string _value="0"; public string Value { get { return _value; } set { _value = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Value")); if (value == "100") MyColor = Brushes.Red; (MyCommandValue as CommandValue).EventCanExec(); } } private Brush myColor= Brushes.Blue; public event PropertyChangedEventHandler? PropertyChanged; public Brush MyColor { get { return myColor; } set { myColor= value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("MyColor")); } } private ICommand myCommandValue; public ICommand MyCommandValue { get { if (myCommandValue == null) { myCommandValue = new CommandValue() { OnAction = new Action<object?>(Action1), OnCanExec=new Func<object, bool>(isEnable) }; } return myCommandValue; } set { myCommandValue= value; } } private void Action1(object? para) { Value= "100"; } private bool isEnable(object data) { return !string.IsNullOrEmpty(Value); } }
到此,就实现了本篇的要求。
行为绑定也就讲完了。
源代码下载:
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

