C# WPF OR ValidationRules 之间的逻辑门
C# WPF OR logical gate between ValidationRules
我正在使用带有验证和保存按钮的组合框,如下所示:
<ComboBox ItemsSource="{Binding ...}"
x:Name="cmbGenerationTariff" IsEnabled="False" >
<ComboBox.SelectedItem>
<Binding Path="..." UpdateSourceTrigger="PropertyChanged" Mode="TwoWay">
<Binding.ValidationRules>
<common:ValidationRuleStringAnyLength ValidatesOnTargetUpdated="True"/>
</Binding.ValidationRules>
</Binding>
</ComboBox.SelectedItem>
</ComboBox>
...
<Button x:Name="btnSaveSite" Click="btnSave_Click" Content="SAVE">
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="IsEnabled" Value="false" />
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding ElementName=cmbGenerationTariff, Path=(Validation.HasError)}" Value="false" />
<Condition Binding="{Binding ElementName=cmbTimeZone, Path=(Validation.HasError)}" Value="false" />
<Condition Binding="{Binding ElementName=txtCity, Path=(Validation.HasError)}" Value="false" />
<Condition Binding="{Binding ElementName=cmbCountry, Path=(Validation.HasError)}" Value="false" />
</MultiDataTrigger.Conditions>
<Setter Property="IsEnabled" Value="true" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
而且效果很好。如果所有元素都有效,则启用保存按钮。
我想要的是在禁用元素时也启用保存按钮(换句话说,我不需要验证禁用元素的值)。
我该怎么做?我可以使用 'OR' 条件吗( 元素有效或元素被禁用 )?
您似乎没有使用 MVVM,但正确的做法是为按钮使用命令并在视图模型中包含 CanExecute
逻辑。在那里您应该能够访问数据的状态并执行更复杂的验证逻辑。
正如@Adi Lester 所说,您最好在此处使用 MVVM pattern。
考虑添加例如MVVMLight 作为依赖项,通过 NuGet,更容易上手。
如果这样做,您将更好地控制自己的逻辑。考虑简单的 Window XAML
<Window.DataContext>
<local:MainViewModel />
</Window.DataContext>
<StackPanel>
<!--Bind to Text and IsEnabled properties in ViewModel-->
<TextBox Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}"
IsEnabled="{Binding IsEnabled}">
</TextBox>
<!--Bind to IsEnabled property in ViewModel-->
<CheckBox Content="Text input enabled"
IsChecked="{Binding IsEnabled}">
</CheckBox>
<!--Bind to SaveCommand in ViewModel-->
<Button Content="Save"
Command="{Binding SaveCommand}">
</Button>
</StackPanel>
留下 MainWindow
代码隐藏 as-is 和 MainViewModel
(DataContext)是
public class MainViewModel : ViewModelBase // <- MVVMLight ViewModel base class
{
private string _text = null;
private bool _isEnabled = true;
public MainViewModel()
{
SaveCommand = new RelayCommand(
// Execute command
() => Console.WriteLine(@"Save command received, input value:{0}", Text),
// Can execute command?
() => !IsEnabled || (IsEnabled && !string.IsNullOrWhiteSpace(Text)));
}
public ICommand SaveCommand { get; set; }
public string Text
{
get { return _text; }
set { _text = value; RaisePropertyChanged(); }
}
public bool IsEnabled
{
get { return _isEnabled; }
set { _isEnabled = value; RaisePropertyChanged(); }
}
}
塔达!现在,当输入文本或未选中复选框时,您就有了切换 Save
按钮 on
的逻辑。作为额外的奖励,您现在正式做对了 ;)
我正在使用带有验证和保存按钮的组合框,如下所示:
<ComboBox ItemsSource="{Binding ...}"
x:Name="cmbGenerationTariff" IsEnabled="False" >
<ComboBox.SelectedItem>
<Binding Path="..." UpdateSourceTrigger="PropertyChanged" Mode="TwoWay">
<Binding.ValidationRules>
<common:ValidationRuleStringAnyLength ValidatesOnTargetUpdated="True"/>
</Binding.ValidationRules>
</Binding>
</ComboBox.SelectedItem>
</ComboBox>
...
<Button x:Name="btnSaveSite" Click="btnSave_Click" Content="SAVE">
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="IsEnabled" Value="false" />
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding ElementName=cmbGenerationTariff, Path=(Validation.HasError)}" Value="false" />
<Condition Binding="{Binding ElementName=cmbTimeZone, Path=(Validation.HasError)}" Value="false" />
<Condition Binding="{Binding ElementName=txtCity, Path=(Validation.HasError)}" Value="false" />
<Condition Binding="{Binding ElementName=cmbCountry, Path=(Validation.HasError)}" Value="false" />
</MultiDataTrigger.Conditions>
<Setter Property="IsEnabled" Value="true" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
而且效果很好。如果所有元素都有效,则启用保存按钮。
我想要的是在禁用元素时也启用保存按钮(换句话说,我不需要验证禁用元素的值)。
我该怎么做?我可以使用 'OR' 条件吗( 元素有效或元素被禁用 )?
您似乎没有使用 MVVM,但正确的做法是为按钮使用命令并在视图模型中包含 CanExecute
逻辑。在那里您应该能够访问数据的状态并执行更复杂的验证逻辑。
正如@Adi Lester 所说,您最好在此处使用 MVVM pattern。
考虑添加例如MVVMLight 作为依赖项,通过 NuGet,更容易上手。
如果这样做,您将更好地控制自己的逻辑。考虑简单的 Window XAML
<Window.DataContext>
<local:MainViewModel />
</Window.DataContext>
<StackPanel>
<!--Bind to Text and IsEnabled properties in ViewModel-->
<TextBox Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}"
IsEnabled="{Binding IsEnabled}">
</TextBox>
<!--Bind to IsEnabled property in ViewModel-->
<CheckBox Content="Text input enabled"
IsChecked="{Binding IsEnabled}">
</CheckBox>
<!--Bind to SaveCommand in ViewModel-->
<Button Content="Save"
Command="{Binding SaveCommand}">
</Button>
</StackPanel>
留下 MainWindow
代码隐藏 as-is 和 MainViewModel
(DataContext)是
public class MainViewModel : ViewModelBase // <- MVVMLight ViewModel base class
{
private string _text = null;
private bool _isEnabled = true;
public MainViewModel()
{
SaveCommand = new RelayCommand(
// Execute command
() => Console.WriteLine(@"Save command received, input value:{0}", Text),
// Can execute command?
() => !IsEnabled || (IsEnabled && !string.IsNullOrWhiteSpace(Text)));
}
public ICommand SaveCommand { get; set; }
public string Text
{
get { return _text; }
set { _text = value; RaisePropertyChanged(); }
}
public bool IsEnabled
{
get { return _isEnabled; }
set { _isEnabled = value; RaisePropertyChanged(); }
}
}
塔达!现在,当输入文本或未选中复选框时,您就有了切换 Save
按钮 on
的逻辑。作为额外的奖励,您现在正式做对了 ;)