2010-02-01 17 views
13

Ho un controllo Expander con la sua proprietà IsExpanded associata a un bool nel modello mvvm. La rilegatura funziona bene fino a quando non tocchi l'espansore. Dopo aver fatto clic sulla freccia nell'espansione per espandere, il binding smette di funzionare. Impostare bool ShowPreview su false nel modello non comprime l'expander.WPF Expander IsExpanded binding

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

Il tuo oggetto con proprietà ShowPreview implementa l'interfaccia INotifyPropertyChanged e genera l'evento quando la tua proprietà viene cambiata? – mattythomas2000

+1

La modalità di rilegatura deve essere due volte. Non appena si espande l'espansione, il binding OneWay si interrompe e l'espansione viene controllata dal framework. – apandit

+0

Grazie! TwoWay funziona. Ma perché non può funzionare su strada? Mi interessa solo il modello che controlla l'espansione e il collasso in base a un evento esterno che lo imposta su true o false. Se il framework espande o comprime l'expander, non mi interessa che il valore venga reimpostato nel modello. – netraju

risposta

7

Se si rimuove Mode=OneWay, questo risolve il problema?

Dopo aver letto l'altro CTQ (le modifiche alla GUI non influiscono sul modello), non ho un buon suggerimento su come limitare il cambiamento visto dai dati sottostanti. Qual è la differenza in:

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

E

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

yes remove mode = oneway funziona. – netraju

0

fare tre cose,

Assicurati che il tuo ViewModel sta attuando INotifyPropertyChanged. L'interfaccia utente abituato a conoscenza del cambiamento se il vostro modello di vista pretende molto informarla quando la proprietà cambia

Passare alla modalità di TwoWay, si desidera che il modello di visualizzazione aggiornata quando i cambiamenti di espansione e volete che il vostro expander aggiornata quando il modello di vista cambia

Infine, se i due precedenti non funzionano, utilizzare un convertitore di debug per verificare se l'associazione non riesce. c'è un esempio here di come fare questo. Questa è una tecnica di cui hanno bisogno tutti gli sviluppatori di wpf.

So che c'era un problema con i pulsanti di opzione che avrebbero perso i collegamenti quando veniva impostato un altro pulsante nel gruppo, non penso che questo sia il problema qui, tuttavia un convertitore di debug ti aiuterà a capirlo.

+0

Grazie per le risposte. Sì, il modello implementa INotifyPropertyChanged. La rilegatura funziona bene finché non si tocca l'espansore. Non appena fai clic con il mouse sull'espansore per espanderlo, l'associazione non funziona più. Nel debug puoi vedere che IsExpanded è impostato su true o false. Ma visivamente l'expander rimane espanso. – netraju

+0

se si inserisce il debug converter, il convertitore di debug continua a essere colpito ogni volta che si modifica lo stato compresso? –

5

Quello che mi ha colto di sorpresa è che IsExpanded è OneWay di default, quindi

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

non funziona come mi aspettavo. Solo se si aggiunge Mode=TwoWay, allora funziona (vale a dire la voce inizia prestando attenzione alla mia proprietà Expanded, e l'aggiornamento di esso), come in

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

Con Silverlight faccio questo:

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

Il legame non si perde quando manualmente espandere/comprimere un Expander ...

+0

L'unica cosa che ho dovuto modificare per wpf era nelle opzioni propertychangedtrigger e value, Binding Path = ShowPreview. A parte questo, questo è stato perfetto per me, grazie. –