WPF - IsEnabled de Liaison à DependencyProperty ne fonctionne pas correctement
J'ai une propriété de dépendance défini dans ma fenêtre comme ci-dessous:
public static readonly DependencyProperty IsGenericUserProperty = DependencyProperty.Register("IsGenericUser", typeof (bool), typeof (MainWindow));
public bool IsGenericUser
{
get { return (bool) GetValue(IsGenericUserProperty); }
set { SetValue(IsGenericUserProperty, value); }
}
Sur ma fenêtre du constructeur-je définir le contexte de données du récipient contenant le bouton:
QuickListButtonsStackPanel.DataContext = this;
Je suis de liaison de la propriété de dépendance à la propriété IsEnabled d'un bouton:
<Button IsEnabled="{Binding IsGenericUser}" .../>
Au démarrage IsGenericUser est vrai, de sorte que le bouton est activé. Lorsque j'ai mis IsGenericUser à false, le bouton a été désactivé. Cependant, si je fais IsGenericUser c'est encore vrai, il ne se passe rien sur le bouton et il reste désactivé.
Ce que je fais mal?
Merci!
edit:
Ici est le style que je suis en utilisant le bouton. Ce style est à l'origine du problème (si le bouton n'a pas de style personnalisée, il fonctionne très bien):
<Style x:Key="BlackButtonStyle" TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<ControlTemplate.Resources>
<Storyboard x:Key="MouseOverActivating">
<ColorAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="rectangle" Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)">
<SplineColorKeyFrame KeyTime="00:00:00" Value="#FF2F2F2F"/>
<SplineColorKeyFrame KeyTime="00:00:00.1270000" Value="#FF2391FF"/>
</ColorAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Key="MouseOverDeactivating">
<ColorAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName="rectangle">
<SplineColorKeyFrame KeyTime="00:00:00" Value="#FF2391FF"/>
<SplineColorKeyFrame KeyTime="00:00:00.2200000" Value="#FF2F2F2F"/>
</ColorAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Key="PressActivating">
<ColorAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="rectangle" Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)">
<SplineColorKeyFrame KeyTime="00:00:00" Value="#FF2391FF"/>
<SplineColorKeyFrame KeyTime="00:00:00.1370000" Value="#FF48D6FF"/>
</ColorAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Key="PressedDeactivating" FillBehavior="Stop" >
<ColorAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName="rectangle">
<SplineColorKeyFrame KeyTime="00:00:00" Value="#FF48D6FF"/>
<SplineColorKeyFrame KeyTime="00:00:00.2370000" Value="#FF2391FF"/>
</ColorAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Key="DisableActivating">
<ColorAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="rectangle" Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)">
<SplineColorKeyFrame KeyTime="00:00:00" Value="#FFA7A7A7"/>
</ColorAnimationUsingKeyFrames>
</Storyboard>
</ControlTemplate.Resources>
<Grid>
<Rectangle Stroke="Transparent" RadiusX="5" RadiusY="5" x:Name="rectangle">
<Rectangle.Fill>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FF000000" Offset="0"/>
<GradientStop Color="#FF2F2F2F" Offset="1"/>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" RecognizesAccessKey="True" OpacityMask="{x:Null}"/>
<Rectangle Stroke="Transparent" RadiusX="5" RadiusY="5" x:Name="WhiteGlow">
<Rectangle.Fill>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#5BFFFFFF" Offset="0"/>
<GradientStop Color="#00FFFFFF" Offset="0.5"/>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsCancel" Value="False"/>
<EventTrigger RoutedEvent="FrameworkElement.Loaded"/>
<Trigger Property="IsFocused" Value="True">
<Trigger.ExitActions>
<BeginStoryboard Storyboard="{StaticResource MouseOverActivating}" x:Name="MouseOverActivating_BeginStoryboard2"/>
</Trigger.ExitActions>
<Trigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource MouseOverActivating}" x:Name="MouseOverActivating_BeginStoryboard1"/>
</Trigger.EnterActions>
</Trigger>
<Trigger Property="IsDefaulted" Value="True"/>
<Trigger Property="IsMouseOver" Value="True">
<Trigger.ExitActions>
<BeginStoryboard Storyboard="{StaticResource MouseOverDeactivating}" x:Name="MouseOverDeactivating_BeginStoryboard"/>
</Trigger.ExitActions>
<Trigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource MouseOverActivating}" x:Name="MouseOverActivating_BeginStoryboard"/>
</Trigger.EnterActions>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Trigger.EnterActions>
<BeginStoryboard x:Name="PressActivating_BeginStoryboard" Storyboard="{StaticResource PressActivating}"/>
</Trigger.EnterActions>
<Trigger.ExitActions>
<BeginStoryboard x:Name="PressedDeactivating_BeginStoryboard" Storyboard="{StaticResource PressedDeactivating}"/>
</Trigger.ExitActions>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Trigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource DisableActivating}" x:Name="DisableActivating_BeginStoryboard"/>
</Trigger.EnterActions>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Est-il autre chose que la cible de ce bouton? Avez-vous définir toutes les propriétés à l'aide de code ou d'appliquer des animations?
Oui, je suis d'appliquer des animations pour le bouton du style. C'est probablement ce causingthe question. Si je n'utilise pas le style de bouton tout fonctionne très bien.
Est-ce que votre bouton ont une commande? Si la commande est CanExecute retourne la valeur false (ou vous n'avez pas notifier que CanExecute a changé), le bouton sera désactivé.
Non, il n'y a pas de commandes. Merci.
OriginalL'auteur Gus Cavalcanti | 2009-06-08
Vous devez vous connecter pour publier un commentaire.
Comment faites-vous la définition de la propriété à False/True? Si je copie ton code, il fonctionne parfaitement. Il y a quelque chose d'autre à faire que vous ne vous attendiez pas à l'effectuer, comme une animation sur le bouton ou quelque chose qui est la compensation de la liaison. Il y a plus de code que vous pouvez poster qui peut aider à clarifier ce qui pourrait faire cela?
Voici le code que j'ai testé:
EDIT:
Vous pouvez ajouter une zone de texte ainsi pour voir si il fonctionne,
Il semble que le problème est seulement avec le style du story-boards, si vous ajoutez que, faut-il encore montrer que IsEnabled est faux quand il ne devrait pas être?
C'est ce que j'ai fait: 1) Créé un nouveau storyboard appelé DisableDeactivating et définir la FillBehavior="Stop" 2) Ensuite, l'ajout d'un BeginStoryboard pour DisableDeactivating dans le Déclencheur.ExitActions de la IsEnabled = false déclencheur.
OriginalL'auteur rmoore
Essayer
La
Path=
ne devrait pas être nécessaire, mais il pourrait faire un differerce.Et à l'aide de la
this
dans le contexte de données, êtes-vous sûr que c'est vrai? Ne serait-ce pas le contrôle de lui-même pour le contexte. Je n'ai pas vu le reste de ton code, mais qui ne semble tout simplement pas droit.OriginalL'auteur Jarrett Meyer
1) a Créé un nouveau storyboard appelé DisableDeactivating et définir la FillBehavior="Stop" (Nicolas suggestion)
2) Ensuite, l'ajout d'un BeginStoryboard pour DisableDeactivating dans le Déclencheur.ExitActions de la IsEnabled = false déclencheur.
OriginalL'auteur Gus Cavalcanti