2012-03-08 4 views
2

更新:この問題は.NET 4.0(私は3.5を使用していました)では修正されています。チェックボックスがユーザーと対話した後でIsCheckedバインディングを失うのはなぜですか?

同じウィンドウのコンボボックスに特定の値が設定されている場合を除いて、ユーザーが手動で設定できるようにチェックボックスを使用しようとしています。

これは、ユーザーが手動でチェックボックスをオンまたはオフにするまで、完全に機能します。その後、コンボボックスの値が変更されると、IsChecked = Trueセッターが機能しなくなります。 IsEnabled = Falseセッターは期待どおりに動作し続けます。

純粋なXamlを使用することが可能になると期待していたときに、コードビハインドでいくつかのロジックを使用する必要がありました。

これはバグか意図した動作であるかどうかは誰にも分かりません。もしそうなら、なぜですか?

<CheckBox> 
Some text here 
<CheckBox.Style> 
    <Style TargetType="{x:Type CheckBox}"> 
     <Setter Property="IsChecked" Value="False" /> 
     <Setter Property="IsEnabled" Value="True" /> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Path=SelectedValue, ElementName=comboBox1, Mode=OneWay}" Value="Disable Checkbox"> 
       <Setter Property="IsChecked" Value="True" /> 
       <Setter Property="IsEnabled" Value="False" /> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</CheckBox.Style> 
</CheckBox> 

ありがとうございます。

+0

いいえこれのためのrepro ... –

答えて

2

あなたのプロジェクトで何か他のことが起こっています。

私は次のことを試してみました:

<Window x:Class="Test.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" 
     Name="Window" 
     SizeToContent="WidthAndHeight"> 
    <StackPanel> 
     <CheckBox> 
      some text here 
      <CheckBox.Style> 
       <Style TargetType="{x:Type CheckBox}"> 
        <Setter Property="IsChecked" Value="False" /> 
        <Setter Property="IsEnabled" Value="True" /> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding Path=SelectedIndex, ElementName=combo, Mode=OneWay}" Value="2"> 
          <Setter Property="IsChecked" Value="True" /> 
          <Setter Property="IsEnabled" Value="False" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </CheckBox.Style> 
     </CheckBox> 
     <ComboBox Name="combo"> 
      <TextBlock>item 1</TextBlock> 
      <TextBlock>item 2</TextBlock> 
      <TextBlock>item 3</TextBlock> 
      <TextBlock>item 4</TextBlock> 
      <TextBlock>item 5</TextBlock> 
     </ComboBox> 
    </StackPanel> 
</Window> 

だから、非常に簡単。ここでの目標は、アイテム3がコンボボックスで選択されたときにIsEnableとIsCheckedと同じ値を正確に設定することです。

これは魅力的です。つまり、ユーザーがチェックボックスをオンにしてチェックを外すと、コンボボックスで「アイテム3」を選択すると、チェックボックスがオンになり、無効になります。彼がcomboBoxで選択したアイテムを再度変更すると、チェックボックスはオフになり、再度有効になり、何度も何度もチェック/アンロックできます。

他にもあなたのために何かが起こっています。あなたが書いたものはうまくいくはずです。

編集:あなたのコメントに関しては、私の代わりに私が最初に使っていたと確かにあなたの問題を再現できたので、これは明らかにの4.0バージョンで修正されたバグである4.0の3.5バージョンでテスト。ネットフレームワーク。

+0

+1このソリューションはSelectedIndexを使用しましたが、SelectedValueはそれを壊すべきではありません。 – Paparazzi

+0

純粋にこのコードを使って新しいプロジェクトを作りましたが、それとまったく同じ効果があります。ユーザーがチェックボックスを手動でチェック/チェック解除するまで、IsChecked状態はコンボボックスの値に正しくバインドされます。その後、コンボボックスの値にかかわらず、IsChecked状態は自動的に変更されません。私は違いがあればWPF 3.5を使用しています。 – Rich

+0

ああ、確かに、これを.net 3.5で試して問題を再現できたので、これは明らかに4.0のバージョンで修正されたバグです(最初はテストプロジェクトで使用していました) – David

関連する問題