私はMVVMパターンが初めてです。
TextChanged()
イベントが発生するたびに、バインドされたIsEnabled()
プロパティの状態が変わらないのはなぜだろうと思っていました。このイベントは、データの検証を確認するためにTextChanged()
呼び出しています。IsValid()
私はこの単純なViewModel
クラスを持っています
public class myViewModel : ViewModel
{
public bool IsOk { get; set; }
public RelayCommand OnValidateExecute { get; set; }
public myViewModel()
{
OnValidateExecute = new RelayCommand(p => IsValid(), p => true);
}
public bool IsValid()
{
// other codes
IsOk = MethodName();
NotifyPropertyChanged("IsOk");
}
}
ブレークポイントを設定するIsValid()
と、コードは正常に動作しています。IsEnabled
プロパティが期待どおりに機能しないのはなぜだろうと思っていました。
これは私のXAML
コードです
<TextBox ...other propeties here....>
<i:Interaction.Triggers>
<i:EventTrigger EventName="TextChanged">
<i:InvokeCommandAction Command="{Binding OnValidateExecute}">
</i:InvokeCommandAction>
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
<Button x:Name="btnSave" IsEnabled="{Binding IsOk, Mode=TwoWay}"
...other propeties here....>
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<i:InvokeCommandAction Command="{Binding OnSaveExecute}">
</i:InvokeCommandAction>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
私が望むのは、IsOk
プロパティが false の場合、ボタンはDisabled
、そうでない場合はEnabled
.
私のデータバインディングに何か問題がありますか? この質問が以前に尋ねられた場合は、親切にリダイレクトしてください。
更新 1
このコードで発生した別の問題はIsValid()
、テキストボックスに値を設定する前に関数が最初にトリガーされることです。ここに例があります。テキストボックスの開始値が であると仮定すると、たとえば9 に変更すると、チェックされる値はではなく0
前の値になります。なぜこれが起こっているのですか?バインディングに問題はありますか?0
9