2

基本的に私は次のような状況にあります:

<TextBox Text="{Binding MyIntValue}" />
<Button prism:Click.Command={Binding MyCommand}" />
public Boolean CanDoCommand()
{
    return (MyIntValue < 100);
}

public void DoCommand() { ... }

ここに問題があります。値 25 を入力すると、MyCommand が有効になります。その後、25A に変更しても、ViewModel のエラーを反映するようにバインディングが更新されていないため、ボタンは有効のままです。代わりに、ビューにバインディング エラーしかありません。これにより、MyCommand ボタンが有効なままになり、MyIntValue は 25 のままになります。

ViewModel が適切であっても、バインドの問題があることに基づいてボタンを無効にするにはどうすればよいですか?

編集(ポスターが本当に求めているもの):

BindingError を持つビューに基づいて、CanExecute メソッドが ViewModel から返すものに関係なく、ボタンを無効にするにはどうすればよいですか?

4

3 に答える 3

0

MyIntValueプロパティがintのタイプである場合、入力が25Aのときにバインディングが更新されることはありません。

これを解決する唯一の方法は、VM側で文字列のタイプとIDataErrorInfoを使用することです。

もう1つの方法は、typeof Nullable intとコンバーターを使用し、期待どおりでない場合は値をnullに設定することです。

編集:

ViewModelが適切であっても、バインディングの問題があることに基づいてボタンを無効にするにはどうすればよいですか?

問題は、VMとUIが同期していないことです。25Aと入力すると、Vmにはまだ25があるため正しいように見えますが、ビューにはBindingErrorがあります。だからあなたの質問はどうすれば私のビューとビューモデルを同期させることができるかということです。(私の2つの提案を参照してください)

編集:別の解決策は、間違った入力を防ぐことです。したがって、MaskedまたはRegexTextboxの動作も機能するはずです。

于 2011-06-13T15:45:37.637 に答える
0

MyIntValueが変更されたときに、コマンドのcanexecutechangedイベントを発生させる必要があります。

于 2011-06-13T15:39:22.333 に答える
0
<Button prism:Click.Command={Binding MyCommand, 
    UpdateSourceTrigger=PropertyChanged}" /> 
于 2011-06-13T15:36:55.173 に答える