WPF Button 的IsEnable繫結到多個屬性
阿新 • • 發佈:2021-07-14
首先看效果
準備一個ViewModel
1 public class TestViewModel : ViewModelBase 2 { 3 private double _argA; 4 5 private double _argB; 6 7 private double _result; 8 9 public RelayCommand<AddObject> AddCmd { get; set; } 10 11 public double ArgA 12 {13 get => _argA; 14 set => Set(value, ref _argA); 15 } 16 17 public double ArgB 18 { 19 get => _argB; 20 set => Set(value, ref _argB); 21 } 22 23 public double Result 24 { 25 get => _result;26 set => Set(value, ref _result); 27 } 28 29 public TestViewModel() 30 { 31 AddCmd = new RelayCommand<AddObject>(Add); 32 } 33 34 private void Add(AddObject addObject) 35 { 36 Result = addObject.ArgA + addObject.ArgB;37 } 38 }
準備一個數據傳輸類
1 public class AddObject 2 { 3 public double ArgA { get; set; } 4 5 public double ArgB { get; set; } 6 }
準備一個多值轉換類
1 public class MultiBindingConverter : IMultiValueConverter 2 { 3 public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 4 { 5 var addObject = new AddObject(); 6 var list = new List<double>(); 7 for (int i = 0; i < values.Length; i++) 8 { 9 //如果返回失敗,直接結束 10 var flag = double.TryParse(values[i].ToString(), out double m); 11 if (!flag) 12 { 13 return null; 14 } 15 list.Add(m); 16 } 17 18 addObject.ArgA = list[0]; 19 addObject.ArgB = list[1]; 20 return addObject; 21 } 22 23 public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 24 { 25 throw new NotImplementedException(); 26 } 27 }
準備一個多值轉換類 控制Button的是否可用
1 public class EnableConverter : IMultiValueConverter 2 { 3 public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 4 { 5 //輸入值能否轉換為數字 6 return values.All(v => double.TryParse(v.ToString(), out _)); 7 } 8 9 public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 10 { 11 throw new NotImplementedException(); 12 } 13 }
前臺介面
1 <Window 2 x:Class="WpfApp1.MainWindow" 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:local="clr-namespace:WpfApp1" 7 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 8 Title="MainWindow" 9 Width="800" 10 Height="450" 11 FontSize="20" 12 mc:Ignorable="d"> 13 <Window.Resources> 14 <local:MultiBindingConverter x:Key="converter" /> 15 <local:EnableConverter x:Key="enableConverter" /> 16 </Window.Resources> 17 <Window.DataContext> 18 <local:TestViewModel /> 19 </Window.DataContext> 20 <Grid> 21 <StackPanel 22 Width="400" 23 HorizontalAlignment="Center" 24 VerticalAlignment="Center" 25 Orientation="Vertical"> 26 <StackPanel Orientation="Horizontal"> 27 <TextBlock Margin="5" Text="引數A" /> 28 <TextBox 29 x:Name="argA" 30 MinWidth="100" 31 Margin="5" 32 Text="{Binding ArgA}" /> 33 </StackPanel> 34 <StackPanel Orientation="Horizontal"> 35 <TextBlock Margin="5" Text="引數B" /> 36 <TextBox 37 x:Name="argB" 38 MinWidth="100" 39 Margin="5" 40 Text="{Binding ArgB}" /> 41 </StackPanel> 42 <StackPanel Orientation="Horizontal"> 43 <TextBlock Margin="5" Text="結果:" /> 44 <TextBlock 45 MinWidth="100" 46 Margin="5" 47 Text="{Binding Result}" /> 48 <Button 49 MinWidth="100" 50 Margin="5" 51 Command="{Binding AddCmd}" 52 Content="計算"> 53 <Button.IsEnabled> 54 <MultiBinding Converter="{StaticResource enableConverter}"> 55 <Binding ElementName="argA" Path="Text" /> 56 <Binding ElementName="argB" Path="Text" /> 57 </MultiBinding> 58 </Button.IsEnabled> 59 <Button.CommandParameter> 60 <MultiBinding Converter="{StaticResource converter}"> 61 <Binding ElementName="argA" Path="Text" /> 62 <Binding ElementName="argB" Path="Text" /> 63 </MultiBinding> 64 </Button.CommandParameter> 65 </Button> 66 </StackPanel> 67 </StackPanel> 68 </Grid> 69 </Window>
這個是否可用,應該是配合資料校驗來使用 比如IDataErrorInfos ValidationRule等。