2016-01-04 3 views
2

Я использую выпадающий с проверкой и кнопки сохранения следующим образом:C# WPF или логические ворота между 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> 

И это прекрасно работает. Кнопка сохранения включена, если все элементы действительны.

Я хочу, чтобы кнопка сохранения включалась также, когда элементы отключены (другими словами, мне не нужно проверять значения отключенных элементов).

Как я могу это сделать? могу ли я использовать условие «ИЛИ» (элемент действителен ИЛИ элемент отключен)?

+0

Что такое 'ValidationRuleStringAnyLength'? Что-то свое? Можете ли вы изменить это, чтобы он также отключил проверку? –

+1

Возможно, вы можете передать элемент в свойство вашего правила 'ValidationRuleStringAnyLength' и проверить, включено ли оно? Что-то вроде '

+0

@MikeEason Это то, что я, вероятно, сделаю, если не найду лучшего способа. Я просто подумал, что у меня есть способ проверить * OR * между условиями в xaml ... – user1028741

ответ

4

Как сказал @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 отделенного кода остается как есть и 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(); } 
    } 
} 

Tadah! Теперь у вас есть логика, которая переключает кнопку Saveon, когда вводится либо текст, либо флажок не установлен. И в качестве дополнительного бонуса вы теперь официально Doing It Right;)

enter image description here

2

Не похоже, что вы используете MVVM, но правильная вещь, которую нужно сделать, это использовать команду для вашей кнопки и иметь логику CanExecute в вашей модели просмотра. Там вы должны иметь доступ к состоянию своих данных и выполнять более сложную логику проверки.

+0

Я думаю, вы могли бы включить какой-то минимальный пример того, как это сделать. –

+0

@JanneMatikainen Это основы MVVM. Сотни примеров существуют в Интернете. –

+1

Очевидно, что ОП не знает основ (или знает основы, но не все), поэтому предоставление чистого примера и объяснение того, что вы делаете, идеально, как @MikkoViitala, только что предоставленная в его ответе. –