2011-05-14 3 views
0

Je crée un UserControl dans WPF, que j'appelle YesNoButton.Liaison WPF «chaînée»

Il possède un seul DependencyProperty, IsChecked, et contient deux ToggleButtons, avec des étiquettes "Oui" et "Non". J'ai lié la propriété IsChecked du Oui ToggleButton à cette propriété IsChecked du parent YesNoButton. J'ai lié la propriété IsChecked du Non ToggleButton à la propriété IsChecked du Oui ToggleButton, à travers un IValueConverter "booléen inverse". Voici mon balisage YesNoButton, moins une partie de l'aspect et la convivialité jabot:

<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> 

Dans mon application, j'inclure le YesNoButton comme suit:

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

Lorsque la fenêtre premières charges, si je bascule le BoolPropertyOfDataContext par d'autres moyens, le YesNoButton réagit parfaitement.

Mais dès que je clique sur le ToggleButton Oui ou Non, bien que l'état visuel YesNoButton se mette à jour correctement, la liaison à BoolPropertyOfDataContext cesse complètement de fonctionner - elle semble être annulée. Je pensais que ces 'chaînes de liaison' étaient supposées fonctionner correctement, mais il me manque évidemment quelque chose ici!

Des idées?

Répondre

0

Je l'ai eu en travaillant en appelant un CheckBox à la place:

<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

Deux suggestions:

  1. Le nom de votre UserControl de sorte que vous pouvez vous y référer
  2. Bind deux ToggleButton états isChecked à la propriété IsChecked pour le UserControl

Par exemple:

+0

Merci. Essayé (1) déjà - aucune différence. J'ai essayé de supprimer complètement le No ToggleButton et cela n'a toujours pas fonctionné, donc je suppose que (2) n'aiderait pas. Je sais dans le passé quand j'ai manuellement défini la propriété IsChecked d'un contrôle à une certaine valeur, que ses liaisons ont été détruites. Je suppose que quelque chose de similaire se passe ici, mais je ne peux pas comprendre quoi. – Ross

+0

Comment BoolPropertyOfDataContext est-il implémenté? Est-ce une propriété de dépendance? En outre, remarquez-vous des messages dans la fenêtre de sortie si vous exécutez sous le débogueur? –

+0

BoolPropertyOfDataContext est un champ booléen d'un objet Entity Framework Entity (et a donc une notification de modification de propriété). Pas de messages dans la fenêtre de sortie, malheureusement! – Ross