IDataErrorInfo インターフェイスを使用して検証を処理する ViewModel を取得しました。これは、ComboBoxes、TextBoxes、Checkboxes などでうまく機能します。
DatePicker は、「DateTime?」へのバインディングに基づいて入力自体を検証するようです。ViewModel 内のプロパティも正常に動作します。
ここで、ViewModel 内からコマンド バインディングを使用してボタンを無効/有効にしたいと考えています。いずれかのコントロールが検証エラーを示している場合、ボタンを無効にする必要があります。
MVVM-Light の RelayCommand を使用すると、 DatePickers 以外のすべてでこれが機能するようになりました。
Relayコマンドコード:
this.DoSomethingCommand = new RelayCommand(this.DoSomething, this.CanDoSomething);
Validation-State を ViewModel に取得する方法はありますか?
これについての助けに本当に感謝します!
誰かが言及する前に: 私は既に Multidatatrigger を使用しようとしたため、ビューで Button IsEnabled プロパティを処理しました。それは機能しませんでした.IsEnabledは、データトリガーを使用して変更できなかった唯一のプロパティでした. CommandBindings がなくても (私の会社の Authentication-Framework が原因かもしれません)
これが私が試したDataTriggerコードです:
<Button x:Uid="Button_1"
Content="DoSomething"
IsDefault="True"
Command="{Binding DoSomethingCommand}">
<Button.Style>
<Style x:Uid="Style_1"
TargetType="{x:Type Button}"
BasedOn="{StaticResource {x:Type Button}}">
<Setter x:Uid="Setter_2"
Property="IsEnabled"
Value="false" />
<Style.Triggers>
<MultiDataTrigger x:Uid="MultiDataTrigger_1">
<MultiDataTrigger.Conditions>
<Condition x:Uid="Condition_1"
Binding="{Binding (Validation.HasError), ElementName=ComboBox1}"
Value="false" />
<Condition x:Uid="Condition_2"
Binding="{Binding (Validation.HasError), ElementName=ComboBox2"
Value="false" />
<Condition x:Uid="Condition_3"
Binding="{Binding (Validation.HasError), ElementName=ComboBox3}"
Value="false" />
<Condition x:Uid="Condition_4"
Binding="{Binding (Validation.HasError), ElementName=ComboBox4}"
Value="false" />
<Condition x:Uid="Condition_5"
Binding="{Binding (Validation.HasError), ElementName=ComboBox5}"
Value="false" />
<Condition x:Uid="Condition_6"
Binding="{Binding (Validation.HasError), ElementName=DatePicker1}"
Value="false" />
<Condition x:Uid="Condition_7"
Binding="{Binding (Validation.HasError), ElementName=DatePicker2}"
Value="false" />
</MultiDataTrigger.Conditions>
<Setter x:Uid="Setter_1"
Property="IsEnabled"
Value="True" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>