2009-09-04 50 views
3

2つのToggleButtonのいずれかのグループ化がいつでもオンになることがある状況を作成しようとしています。 UIの状態が更新されないバッキング変数の状態を変更した場合の問題です。WPF ToggleButton IsCheckedバインディングの問題

私はINotifyPropertyChangedを実装しています。

私はこのような私のToggleButton秒作成しました:

 <ToggleButton IsChecked="{Binding Path=IsPermanentFailureState, Mode=TwoWay}" 
         HorizontalContentAlignment="Center" 
         VerticalContentAlignment="Center"> 
      <TextBlock TextWrapping="Wrap" 
         TextAlignment="Center">Permanent Failure</TextBlock> 
     </ToggleButton> 
     <ToggleButton IsChecked="{Binding Path=IsTransitoryFailureState, Mode=TwoWay}" 
         HorizontalContentAlignment="Center" 
         VerticalContentAlignment="Center"> 
      <TextBlock TextWrapping="Wrap" 
         TextAlignment="Center">Temporary Failure</TextBlock> 
     </ToggleButton> 

これは、(私はMVVMパターンを使用しています私のバッキング性質であるが、他のバインディングが動作し、ToggleButton上のIEをクリックすると、これらのプロパティの設定を入力しません。私は、コードを経由して状態を変更していた場合、トグルボタンは、視覚的な状態を変更しないでください。IEは私がfalseにバッキングプロパティを設定していますが、ボタンがチェックされたままになります。

public bool? IsPermanentFailureState 
    { 
     get { return isPermFailure; } 
     set 
     { 
      if (isPermFailure != value.Value) 
      { 
       NotifyPropertyChanged("IsPermanentFailureState"); 
      } 
      isPermFailure = value.Value; 
      if (isPermFailure) IsTransitoryFailureState = false; 
     } 
    } 

    public bool? IsTransitoryFailureState 
    { 
     get { return isTransitoryFailureState; } 
     set 
     { 
      if (isTransitoryFailureState != value.Value) 
      { 
       NotifyPropertyChanged("IsTransitoryFailureState"); 
      } 
      isTransitoryFailureState = value.Value; 
      if (isTransitoryFailureState) IsPermanentFailureState = false; 
     } 
    } 

答えて

8

問題だけではあなたの」です不動産変更のお知らせを提起する実際にプロパティ値を変更する前にオンにしてください。したがって、WPFは新しいプロパティではなくプロパティの古い値を読み取ります。ちなみに、コードではなくインターフェイスを使用すると機能すると言われますが、私はそれが可能であるとは思えません。

+0

あなたは私にそれを打つケント。私から上向きの矢があります。 –

+1

うわー - 私はこのばかだとは思わない!それはたぶんあなたが座って一人でコードを書くときに起こることでしょう。ありがとう! –

0

コードが間違っているように見えます。作成する前に変更を通知しています。私はあなたが移動する必要があると思います isPermFailure = value.Value; 内部:

 if (isPermFailure != value.Value)    
     { 
      isPermFailure = value.Value; 
      NotifyPropertyChanged("IsPermanentFailureState"); 
     } 

と同様に、

私はあなたがあまりにも、そこに他のステートメントを移動したいと思います:

 if (isPermFailure != value.Value)    
     { 
      isPermFailure = value.Value; 
      NotifyPropertyChanged("IsPermanentFailureState"); 
      if (isPermFailure) 
       IsTransitoryFailureState = false; 
     } 

そうでなければ、不必要に、その1つの上の状態と通知を設定することがあります。

+1

あなたの最後のコメントについて:いいえ、それは不必要に通知しません。それは不必要にプロパティを呼び出すことだけです。セッターロジックは、基になるフィールドが変更された場合にのみ通知を行います。 –

+1

あなたは絶対に正しいです:言葉の不注意な選択ですが、私はまだ私がより良い答えだと思います。 :-) – serialhobbyist

関連する問題