WPF MVVMToolkit框架学习 命令的全局CanExecute
首先看效果
实现方式也很简单,给ViewModel的PropertyChanged事件挂载命令的可否执行方法就行
Xaml代码
1 <Window 2 x:Class="MVVMToolkit框架学习.Views.RegisterView" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 6 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 7 xmlns:md="http://materialdesigninxaml.net/winfx/xaml/themes" 8 xmlns:sys="clr-namespace:System;assembly=mscorlib" 9 xmlns:vm="clr-namespace:MVVMToolkit框架学习.ViewModels" 10 Title="RegisterView" 11 Width="250" 12 Height="300" 13 d:DataContext="{d:DesignInstance Type={x:Type vm:RegisterVM}}" 14 WindowStartupLocation="CenterScreen" 15 mc:Ignorable="d"> 16 <Window.Resources> 17 <ObjectDataProvider 18 x:Key="GenderEnumTypes" 19 MethodName="GetValues" 20 ObjectType="{x:Type sys:Enum}"> 21 <ObjectDataProvider.MethodParameters> 22 <x:Type TypeName="vm:EGender" /> 23 </ObjectDataProvider.MethodParameters> 24 </ObjectDataProvider> 25 <Style BasedOn="{StaticResource MaterialDesignTextBox}" TargetType="TextBox"> 26 <Setter Property="Margin" Value="5,0,0,20" /> 27 <Setter Property="MinWidth" Value="150" /> 28 <Setter Property="md:HintAssist.HelperTextFontSize" Value="10" /> 29 </Style> 30 </Window.Resources> 31 <Grid> 32 <StackPanel 33 HorizontalAlignment="Center" 34 VerticalAlignment="Center" 35 Orientation="Vertical"> 36 <StackPanel Orientation="Horizontal"> 37 <md:PackIcon VerticalAlignment="Center" Kind="Account" /> 38 <TextBox 39 md:HintAssist.HelperText="Input..." 40 md:HintAssist.Hint="Name" 41 md:TextFieldAssist.HasClearButton="True" 42 Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" Cursor="IBeam" /> 43 </StackPanel> 44 <StackPanel Orientation="Horizontal"> 45 <md:PackIcon VerticalAlignment="Center" Kind="Phone" /> 46 <TextBox 47 md:HintAssist.HelperText="Input..." 48 md:HintAssist.Hint="Phone" 49 md:TextFieldAssist.HasClearButton="True" 50 Text="{Binding Phone, UpdateSourceTrigger=PropertyChanged}" /> 51 </StackPanel> 52 <StackPanel Orientation="Horizontal"> 53 <md:PackIcon VerticalAlignment="Center" Kind="GenderMaleFemale" /> 54 <ComboBox 55 MinWidth="150" 56 Margin="5,0,0,20" 57 md:HintAssist.HelperText="Input..." 58 md:HintAssist.Hint="Gender" 59 md:TextFieldAssist.HasClearButton="True" 60 ItemsSource="{Binding Source={StaticResource GenderEnumTypes}}" 61 SelectedItem="{Binding Gender, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 62 </StackPanel> 63 <Button 64 Margin="20,20" 65 Command="{Binding RegisterCmd}" 66 Content="Register..." /> 67 </StackPanel> 68 </Grid> 69 </Window>
cs代码
1 using Microsoft.Toolkit.Mvvm.ComponentModel; 2 using Microsoft.Toolkit.Mvvm.Input; 3 using System; 4 using System.Collections.Generic; 5 using System.ComponentModel.DataAnnotations; 6 using System.Linq; 7 using System.Text; 8 using System.Threading.Tasks; 9 using System.Windows; 10 using System.Windows.Input; 11 12 namespace MVVMToolkit框架学习.ViewModels 13 { 14 public enum EGender 15 { 16 Women, 17 18 Men, 19 20 Other, 21 } 22 23 public class RegisterVM : ObservableValidator 24 { 25 private string _name; 26 27 private EGender _gender; 28 29 private string _phone; 30 31 [Required(ErrorMessage = "名字是必须的!")] 32 [StringLength(10, ErrorMessage = "名字长度不能超过10")] 33 public string Name 34 { 35 get => _name; 36 set => SetProperty(ref _name, value, true); 37 } 38 39 [Required(ErrorMessage = "电话号码是必须的!")] 40 [Phone(ErrorMessage = "输入内容不是电话号码!")] 41 public string Phone 42 { 43 get => _phone; 44 set => SetProperty(ref _phone, value, true); 45 } 46 47 public EGender Gender 48 { 49 get => _gender; 50 set => SetProperty(ref _gender, value, true); 51 } 52 53 public IRelayCommand RegisterCmd { get; set; } 54 55 public RegisterVM() 56 { 57 PropertyChanged += (s, e) => 58 { 59 //通知命令能否执行 60 RegisterCmd?.NotifyCanExecuteChanged(); 61 }; 62 RegisterCmd = new RelayCommand(Register, () => 63 { 64 //首先验证所有的属性 65 ValidateAllProperties(); 66 return !HasErrors; 67 }); 68 } 69 70 private void Register() 71 { 72 MessageBox.Show("注册成功!"); 73 } 74 } 75 }