2010-02-01 12 views
13

J'ai un contrôle Expander avec sa propriété IsExpanded liée à un bool dans le modèle mvvm. La liaison fonctionne bien jusqu'à ce que vous ne touchez pas l'expander. Une fois que vous cliquez sur la flèche dans l'expandeur pour développer, la liaison cesse de fonctionner. La définition de la valeur booléenne ShowPreview sur false dans le modèle ne réduit pas l'extension.Liaison WPF Expander IsExpanded

<Expander Name="pExpander" 
      IsExpanded="{Binding Path=ShowPreview,Mode=OneWay}" 
      Header="Preview"> 
    <TextBlock Text="{Binding Path=Message, Mode=OneWay}"></TextBlock>  
</Expander> 
+0

Votre objet avec la propriété ShowPreview met-il en œuvre l'interface INotifyPropertyChanged et déclenche-t-il l'événement lorsque votre propriété est modifiée? – mattythomas2000

+1

Le mode de liaison doit être TwoWay. Dès que vous développez sur l'expander, la liaison OneWay s'effondre et l'expansion est contrôlée par cadre. – apandit

+0

Merci! TwoWay fonctionne. Mais pourquoi ça ne marche pas? Je ne m'intéresse qu'au modèle contrôlant l'expansion et l'effondrement basé sur un événement externe qui le définit comme vrai ou faux. Si le framework étend ou réduit l'expandeur, je ne suis pas intéressé par le fait que cette valeur soit remise dans le modèle. – netraju

Répondre

7

Si vous supprimez Mode=OneWay cela résout-il le problème? Lors de la lecture de votre autre CTQ (les modifications de l'interface graphique n'affectent pas le modèle), je n'ai pas une bonne suggestion pour limiter la modification vue par les données sous-jacentes. Quelle est la différence:

myModel.MyProperty = true; // in *your* code behind 

Et

myModel.MyProperty = true; // done by a binding 
+0

oui mode de suppression = oneway fonctionne. – netraju

0

trois choses,

Assurez-vous que votre ViewModel met actuellement en œuvre INotifyPropertyChanged. Votre ui ne saurez pas le changement si votre modèle de vue ne marche pas l'informer lorsque la propriété change

Changer le mode de TwoWay, vous voulez que votre modèle de vue mis à jour lorsque les changements d'extension et vous voulez que votre extension mis à jour lorsque le modèle de vue change

Enfin, si les deux méthodes ci-dessus ne fonctionnent pas, utilisez un convertisseur de débogage pour vérifier si la liaison est défaillante. il y a un exemple here de la façon de le faire. C'est une technique dont chaque développeur a besoin. Je sais qu'il y avait un problème avec les boutons radio qu'ils perdraient leurs liaisons quand un autre bouton du groupe a été réglé, je ne pense pas que ce soit le problème ici, cependant un convertisseur de débogage vous aidera à comprendre cela.

+0

Merci pour les réponses. Oui, le modèle implémente INotifyPropertyChanged. La liaison fonctionne bien tant que vous ne touchez pas l'expandeur. Dès que vous cliquez sur l'expandeur pour agrandir, la liaison ne fonctionne plus. Dans le débogage, vous pouvez voir que IsExpanded est défini sur true ou false. Mais visuellement, l'expandeur reste étendu. – netraju

+0

Si vous activez le convertisseur de débogage, le convertisseur de débogage continue-t-il à être touché à chaque fois que vous modifiez l'état réduit? –

5

Ce qui m'a attiré ici est que IsExpanded est OneWay par défaut,

<Style TargetType="TreeViewItem"> 
    <Setter Property="IsExpanded" Value="{Binding Expanded}"/> 
</Style> 

ne fonctionne pas comme je m'y attendais. Seulement si vous ajoutez Mode=TwoWay, il fonctionne (à savoir l'élément commence prêter attention à ma propriété Expanded, et sa mise à jour), comme dans

<Style TargetType="TreeViewItem"> 
    <Setter Property="IsExpanded" Value="{Binding Expanded, Mode=TwoWay}"/> 
</Style> 
1

Avec Silverlight Je fais ceci:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 

<Expander Name="pExpander" IsExpanded="True" Header="Preview"> 
    <i:Interaction.Triggers> 
     <ei:PropertyChangedTrigger Binding="{Binding ShowPreview, Mode=OneWay}"> 
      <ei:ChangePropertyAction PropertyName="IsExpanded" Value="{Binding ShowPreview, Mode=OneWay}"/> 
     </ei:PropertyChangedTrigger> 
    </i:Interaction.Triggers> 
    <TextBlock Text="{Binding Path=Message, Mode=OneWay}"></TextBlock>  
</Expander> 
<Expander Name="pExpander1" IsExpanded="True" Header="Preview 1"> 
    <i:Interaction.Triggers> 
     <ei:PropertyChangedTrigger Binding="{Binding ShowPreview, Mode=OneWay}"> 
      <ei:ChangePropertyAction PropertyName="IsExpanded" Value="{Binding ShowPreview, Mode=OneWay}"/> 
     </ei:PropertyChangedTrigger> 
    </i:Interaction.Triggers> 
    <TextBlock Text="{Binding Path=Message1, Mode=OneWay}"></TextBlock>  
</Expander> 
//... 

La liaison n'est pas perdu lorsque vous développez/réduisez manuellement un Expander ...

+0

La seule chose que j'ai dû changer pour wpf était dans les options propertychangedtrigger et value, Binding Path = ShowPreview. A part ça, c'était parfait pour moi, merci. –