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>
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. –
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
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é! :( –