2009-08-13 6 views
1

J'ai remplacé un ComboBox afin d'ajouter un bouton supplémentaire à la fin du combo - je l'utilise pour naviguer dans mon application.wpf ContentPresenter ne permet pas d'activer/désactiver

C'est une application M-V-VM qui a un mécanisme Edit-Save/Cancel qui désactive ou active les contrôles selon que l'utilisateur est en mode 'edit' ou non. Je voulais que mon bouton de navigation soit toujours disponible, que la vue soit activée ou désactivée.

Pour ce faire, je lie le ToggleButton et le ContentPresenter à une propriété IsEditable sur mon modèle.

Le bouton bascule active et désactive comme prévu, mais le texte de la liste déroulante reste activé.

Comme le texte est livré par le ContentPresenter et le ContentPresenter a une propriété IsEnabled Je ne comprends pas pourquoi il ne désactivera pas?

Quelqu'un peut-il vous aider? Merci Andy

<Style TargetType="local:EntityCombo"> 
    <Setter Property="SnapsToDevicePixels" Value="true"/> 
    <Setter Property="OverridesDefaultStyle" Value="true"/> 
    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/> 
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/> 
    <Setter Property="ScrollViewer.CanContentScroll" Value="true"/> 
    <Setter Property="MinWidth" Value="120"/> 
    <Setter Property="MinHeight" Value="20"/> 
    <Setter Property="FontSize" Value="12" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="local:EntityCombo" > 
       <Grid> 
        <ToggleButton 
         IsEnabled="{Binding IsEditable}" 
         Name="ToggleButton" 
         Template="{DynamicResource ComboBoxToggleButton}" 
         Grid.Column="2" 
         Focusable="false" 
         IsChecked="{Binding Path=IsDropDownOpen,Mode=TwoWay,RelativeSource={RelativeSource TemplatedParent}}" 
         ClickMode="Press"> 
        </ToggleButton> 
        <Button Grid.Column="2" Style="{DynamicResource EntitySelectedButton}" Command="{TemplateBinding EntitySelected}" CommandParameter="{TemplateBinding SelectedItem}"></Button> 
        <ContentPresenter 
         IsEnabled="{Binding IsEditable}" 
         Name="ContentSite" 
         IsHitTestVisible="False" 
         Content="{TemplateBinding SelectionBoxItem}" 
         ContentTemplate="{DynamicResource SelectionBoxItem}" 
         ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" 
         Margin="3,3,23,3" 
         VerticalAlignment="Center" 
         HorizontalAlignment="Left" /> 
        <Popup 
         Name="Popup" 
         Placement="Bottom" 
         IsOpen="{TemplateBinding IsDropDownOpen}" 
         AllowsTransparency="True" 
         Focusable="False" 
         PopupAnimation="Slide"> 
         <Grid 
      Name="DropDown" 
      SnapsToDevicePixels="True"     
      MinWidth="{TemplateBinding ActualWidth}" 
      MaxHeight="{TemplateBinding MaxDropDownHeight}"> 
          <Border 
      x:Name="DropDownBorder" 
      Background="{StaticResource WindowBackgroundBrush}" 
      BorderThickness="1" 
      BorderBrush="{StaticResource SolidBorderBrush}"/> 
          <ScrollViewer Margin="4,6,4,6" SnapsToDevicePixels="True"> 
           <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" /> 
          </ScrollViewer> 
         </Grid> 
        </Popup> 
       </Grid> 
       <ControlTemplate.Triggers> 
        <Trigger Property="HasItems" Value="false"> 
         <Setter TargetName="DropDownBorder" Property="MinHeight" Value="95"/> 
        </Trigger> 
        <Trigger Property="IsEnabled" Value="false"> 
         <Setter Property="Foreground" Value="DarkGray"/> 
        </Trigger> 

        <Trigger Property="IsEnabled" Value="true"> 
         <Setter Property="Foreground" Value="Red"/> 

        </Trigger> 
        <Trigger Property="IsGrouping" Value="true"> 
         <Setter Property="ScrollViewer.CanContentScroll" Value="false"/> 
        </Trigger> 
        <Trigger SourceName="Popup" Property="Popup.AllowsTransparency" Value="true"> 
         <Setter TargetName="DropDownBorder" Property="CornerRadius" Value="4"/> 
         <Setter TargetName="DropDownBorder" Property="Margin" Value="0,2,0,0"/> 
        </Trigger> 

       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
    </Style.Triggers> 
</Style> 

Répondre

2

Ceci est une question difficile, mais j'ai été assez profond dans WPF assez longtemps pour être très persistant. :) Après avoir suggéré dans mon dernier commentaire ma folie m'a poussé à le tester et il est bien le problème:

Le modèle fixe ComboBox.Foreground basé sur ComboBox.IsEnabled, mais vous voulez le style du contenu basé sur DataContext.IsEnabled, de sorte que vous aurait besoin de style le ContentPresenter lui-même. Mais vous ne pouvez pas style ContentPresenter car il hérite de FrameworkElement, pas de contrôle. Mais vous pouvez remplacer le ContentPresenter par un ContentControl et le styler avec les déclencheurs appropriés pour votre apparence désactivée.

+0

Merci pour votre suggestion, mais le IsEditable est sur mon ViewModel qui est le DataContext. Le ToggleButton fonctionne correctement, c'est-à-dire Active et désactive - c'est simplement le ContentPresenter qui ne l'activera pas. –

+0

Désolé - je n'ai pas assez lu cette partie. Ces bizarreries de liaison peuvent être si aggravantes. Avez-vous essayé d'activer les sources de trace (PresentationTraceSources.TraceLevel = "High") pour cette liaison pour voir ce qui se passe réellement lorsqu'elle essaie d'obtenir la valeur? – AndyM

+0

Même si je ne fais que définir IsEnabled sur ContentPresenter sur False, c'est-à-dire que je ne lie pas du tout - alors le texte apparaît toujours comme Activé! :( –

Questions connexes