效果是:当TextBox控件的Text属性为空时show按钮不可用,有值时show按钮可用
项目结构
界面代码
<Window x:Class="WpfApp1.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WpfApp1"mc:Ignorable="d"Title="MainWindow" Height="350" Width="525"><Grid><Label Content="输入的值" HorizontalAlignment="Left" Margin="68,52,0,0" VerticalAlignment="Top" Height="35" Width="69"/><!--TextWrapping="Wrap" 内容是否换行,KeyUp="txtTitle_KeyUp"--><!--UpdateSourceTrigger=PropertyChanged} 文本框里输入的值会实时更新到绑定的属性中--><TextBox Name="txtTitle" Text="{Binding Title,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Margin="142,52,0,242.667" TextWrapping="Wrap" Width="123"/><Button Content="SHOW" Command="{Binding ValueCommand}" CommandParameter="123" HorizontalAlignment="Left" Margin="285,55,0,0" VerticalAlignment="Top" Width="78" Height="23"/><!-- 控件数据的绑定--><Label Content="{Binding Title}" HorizontalAlignment="Left" Margin="142,87,0,0" VerticalAlignment="Top"/></Grid>
</Window>
主窗体 视图模型
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using WpfApp1.Base;namespace WpfApp1.ViewModels
{/// <summary>/// 主窗体 视图模型/// </summary>public class MainViewModel : INotifyPropertyChanged{public MainViewModel(){_valueCommand = new CommandBase() {DoAction = new Action<object>(ValueCommandAction),DoCanExecute = new Func<object, bool>(CanExecute)};}public event PropertyChangedEventHandler PropertyChanged;private string _title;public string Title{get { return _title; }set {_title = value;//数据更新 通知界面绑定的地方更新数据PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Title"));(this.ValueCommand as CommandBase).RaiseCanChanged();}}private ICommand _valueCommand;/// <summary>/// 命令行为/// </summary>public ICommand ValueCommand{get { return _valueCommand; }set { _valueCommand = value; }}private void ValueCommandAction(object obj){//obj = CommandParameterTitle = obj.ToString();}private bool CanExecute(object obj){return !string.IsNullOrEmpty(Title);}}
}
CommandBase
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;namespace WpfApp1.Base
{/// <summary>/// 命令行为 基类/// </summary>public class CommandBase : ICommand{public event EventHandler CanExecuteChanged;/// <summary>/// 是否可执行/// </summary>/// <param name="parameter"></param>/// <returns></returns>public bool CanExecute(object parameter){return DoCanExecute.Invoke(parameter);}/// <summary>/// 执行逻辑/// </summary>/// <param name="parameter"></param>public void Execute(object parameter){//控制逻辑DoAction?.Invoke(parameter);}/// <summary>/// 作什么事/// 处理业务逻辑/// </summary>public Action<object> DoAction { get; set; }/// <summary>/// 是否可执行/// 参数是object ,返回值是bool/// </summary>public Func<object, bool> DoCanExecute { get; set; }public void RaiseCanChanged(){CanExecuteChanged?.Invoke(this,new EventArgs());}}
}
END