效果是:当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 = CommandParameter
Title = 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