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 }

 

posted @ 2021-12-28 11:32  只吃肉不喝酒  阅读(482)  评论(0编辑  收藏  举报