2011-05-14 27 views
0

私はWPFでUserControlを作成していますが、これはYesNoButtonです。'連鎖' WPFバインディング

これには1つのDependencyProperty、IsCheckedがあり、2つのToggleButtonがあり、ラベルは「Yes」と「No」です。 はい ToggleButtonのIsCheckedプロパティを、親のYesNoButtonのこのIsCheckedプロパティにバインドしました。 いいえ ToggleButtonのIsCheckedプロパティを、はい ToggleButtonのIsCheckedプロパティに 'inverse boolean' IValueConverterによってバインドしました。ここに私のYesNoButtonマークアップです、マイナスの外観の一部とフリルを感じる:

私のアプリで
<UserControl ...> 
    <StackPanel Orientation="Horizontal"> 
     <ToggleButton x:Name="YesButton" IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type Controls:YesNoButton}}, Path=IsChecked}">Yes</ToggleButton> 
     <ToggleButton IsChecked="{Binding ElementName=YesButton, Path=IsChecked, Converter={StaticResource BooleanToInverseConverter}}">No</ToggleButton> 
    </StackPanel> 
</UserControl> 

、次のように私はYesNoButtonを含める:

<local:YesNoButton IsChecked="{Binding Path=BoolPropertyOfDataContext}" /> 

ウィンドウが最初にロードし、私はBoolPropertyOfDataContextを切り替える場合他の手段でYesNoButtonは完全に反応します。

はい、いいえToggleButtonをクリックすると、YesNoButtonビジュアル状態が正しく更新されますが、BoolPropertyOfDataContextへのバインドは完全に機能しなくなります。キャンセルされたようです。私はこれらのバインディングチェーンがうまくいくと考えていたと思っていましたが、私は明らかに何かをここに逃しています!

アイデア?

答えて

0

代わりにCheckBoxをスタイリングして動作させました。

<CheckBox IsChecked="{Binding Path=BoolPropertyOfDataContext}" Style="{StaticResource YesNoButton}" /> 

<Style x:Key="YesNoButton" TargetType="{x:Type CheckBox}"> 
    <Setter Property="OverridesDefaultStyle" Value="True" /> 
    <Setter Property="SnapsToDevicePixels" Value="True" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type CheckBox}"> 

       <StackPanel Orientation="Horizontal"> 
        <ToggleButton x:Name="YesButton" IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type CheckBox}}, Path=IsChecked}">Yes</ToggleButton> 
        <ToggleButton IsChecked="{Binding ElementName=YesButton, Path=IsChecked, Converter={StaticResource BooleanToInverseConverter}}">No</ToggleButton> 
       </StackPanel> 

      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
1

つの提案:ユーザーコントロール例えば

ためにisCheckedプロパティにそれに

  • バインドトグルボタンにisCheckedの両方の状態を

    1. 名前あなたのUserControl参照できるように:

      <StackPanel Orientation="Horizontal"> 
          <ToggleButton IsChecked="{Binding ElementName=YesNoButton, Path=IsChecked}">Yes</ToggleButton> 
          <ToggleButton IsChecked="{Binding ElementName=YesNoButton, Path=IsChecked, Converter={StaticResource BooleanToInverseConverter}}">No</ToggleButton> 
      </StackPanel> 
      
  • +0

    ありがとうございました。既に試した(1) - 違いはありません。私はNo ToggleButtonを完全に削除しようとしましたが、まだ動作しませんでしたので、(2)は役に立たないと思います。過去に、コントロールのIsCheckedプロパティを手動で何らかの値に設定したとき、バインディングが破棄されたことがわかった。私はここで何か似たようなことが起こっていると仮定しますが、何が分からないのですか? – Ross

    +0

    BoolPropertyOfDataContextはどのように実装されていますか?依存関係のプロパティですか?また、デバッガで実行すると、出力ウィンドウにメッセージが表示されますか? –

    +0

    BoolPropertyOfDataContextは、Entity Framework Entityオブジェクトのブール値フィールドです(プロパティ変更通知も同様です)。残念ながら出力ウィンドウにメッセージはありません! – Ross