2010-02-01 16 views
13

Tengo un control Expander con su propiedad IsExpanded vinculada a un bool en el modelo mvvm. El enlace funciona bien hasta que no toques el expansor. Una vez que hace clic en la flecha del expansor para expandirse, el enlace deja de funcionar. Establecer bool ShowPreview en false en el modelo no colapsará el expansor.WPF Expander IsExpanded vinculante

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

¿Su objeto con la propiedad ShowPreview implementa la interfaz INotifyPropertyChanged y genera el evento cuando se cambia su propiedad? – mattythomas2000

+1

El modo de enlace debe ser bidireccional. Tan pronto como se expande en el expansor, el enlace OneWay colapsa y la expansión es controlada por el marco. – apandit

+0

¡Gracias! TwoWay funciona. Pero, ¿por qué no puede funcionar de una sola vez? Solo estoy interesado en el modelo que controla la expansión y el colapso en función de un evento externo que lo establece en verdadero o falso. Si el marco se expande o contrae el expansor, no estoy interesado en que ese valor se vuelva a establecer en el modelo. – netraju

Respuesta

7

Si elimina Mode=OneWay soluciona el problema?

Al leer su otro CTQ (los cambios en la GUI no afectan al modelo), no tengo una buena sugerencia sobre cómo limitar el cambio que ven los datos subyacentes. ¿Cuál es la diferencia en:

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

Y

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

sí quitando el modo = oneway funciona. – netraju

0

hacer tres cosas,

Asegúrese de que su ViewModel está implementando INotifyPropertyChanged. Su interfaz de usuario no sabrá sobre el cambio si su modelo de vista duerma le informe cuando la propiedad cambia

cambiar el modo a TwoWay, usted quiere que su modelo de vista actualiza cuando cambia el expansor y quiere que su expansor actualiza cuando el modelo de vista cambia

Por último, si los dos anteriores no funcionan, utilice un convertidor de depuración para determinar si su enlace está fallando. hay un ejemplo here de cómo hacer esto. Esta es una técnica que todo desarrollador de wpf necesita.

Sé que había un problema con los botones de opción de que perderían sus enlaces cuando se configuró otro botón en el grupo, no creo que ese sea el problema, sin embargo, un conversor de errores lo ayudará a resolverlo.

+0

Gracias por las respuestas. Sí, el Modelo implementa INotifyPropertyChanged. El enlace funciona bien siempre y cuando no toque el expansor. Tan pronto como haga clic con el mouse en el expansor para expandirse, el enlace ya no funcionará. En la depuración, puede ver que IsExpanded se establece en verdadero o falso. Pero visualmente, el expansor se mantiene expandido. – netraju

+0

si enciendes el convertidor de depuración, ¿el convertidor de depuración sigue siendo afectado cada vez que cambias el estado contraído? –

5

Lo que me llamó aquí es que IsExpanded es OneWay por defecto, así

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

no funciona como yo esperaba. Sólo si se agrega Mode=TwoWay, entonces funciona (es decir, el tema comienza a prestar atención a mi propiedad Expanded, así como su actualización), como en

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

Con Silverlight hago esto:

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 unión no se pierde al expandir/colapsar manualmente un Expansor ...

+0

Lo único que tuve que cambiar para wpf fue en las opciones propertychangegedigigger y value, Binding Path = ShowPreview. Aparte de eso, esto fue perfecto para mí, gracias. –