2009-06-08 8 views
3

J'ai une propriété de dépendance définie dans ma fenêtre comme ci-dessous:WPF - IsEnabled Reliure à DependencyProperty ne fonctionne pas correctement

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 le constructeur de ma fenêtre, je mets le contexte de données du récipient contenant le bouton:

QuickListButtonsStackPanel.DataContext = this; 

Je lient la propriété de dépendance à la propriété IsEnabled d'un bouton:

<Button IsEnabled="{Binding IsGenericUser}" .../> 

Au démarrage, IsGenericUser a la valeur true, le bouton est donc activé. Lorsque je mets IsGenericUser à false, le bouton est désactivé. Cependant, si je rend IsGenericUser encore une fois, rien ne se passe sur le bouton et il reste désactivé. Qu'est-ce que je fais de mal?

Merci!

éditer: Voici le style que j'utilise avec le bouton. Ce style est l'origine du problème (si le bouton n'a pas de style personnalisé 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> 
+0

Désolé, travailler tout va bien dans un projet de test en utilisant tout ce que je décrit ci-dessus. Quelque chose d'autre, spécifique à mon projet, pourrait être faux. –

+1

Y a-t-il autre chose sur ce bouton? Définissez-vous des propriétés à l'aide du code ou y appliquez-vous des animations? – rmoore

+0

Oui, j'applique des animations au style du bouton. C'est probablement ce qui cause le problème. Si je n'utilise pas le style de bouton, tout fonctionne bien. –

Répondre

5

Comment êtes-vous de définir la propriété sur False/vrai? Si je copie votre code tel quel, cela fonctionne parfaitement. Il doit y avoir quelque chose d'autre que vous ne pouvez pas vous attendre à faire, comme une animation sur le bouton ou quelque chose qui efface la liaison. Y a-t-il plus de code que vous pouvez publier pour clarifier ce qui pourrait être fait?

Voici le code que je teste ainsi:

<Window x:Class="WpfApplication6.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" 
    Height="300" 
    Width="300"> 
<Grid> 
    <StackPanel x:Name="QuickListButtonsStackPanel"> 
     <Button IsEnabled="{Binding IsGenericUser}" 
       Content="Bound Button" /> 
     <Button Content="Change Binding" 
       Click="Button_Click" /> 
    </StackPanel> 
</Grid> 

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
     QuickListButtonsStackPanel.DataContext = this; 
    } 
    public static readonly DependencyProperty IsGenericUserProperty = 
     DependencyProperty.Register(
      "IsGenericUser", 
      typeof(bool), 
      typeof(Window1)); 

    public bool IsGenericUser 
    { 
     get { return (bool)GetValue(IsGenericUserProperty); } 
     set { SetValue(IsGenericUserProperty, value); } 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     IsGenericUser = !IsGenericUser; 
    } 
} 

EDIT: Vous pouvez ajouter une zone de texte et voir si ça fonctionne,

<Button x:Name="uiButton" 
     IsEnabled="{Binding IsGenericUser}" 
     Style="{StaticResource BlackButtonStyle}" 
     Content="Bound Button"/> 
<TextBlock Text="{Binding ElementName=uiButton, Path=IsEnabled}" /> 

On dirait que le problème est juste avec les storyboards du style, si vous ajoutez cela, cela montre-t-il encore que IsEnabled est faux quand il ne devrait pas être?

+0

Merci encore. Vous avez raison - le style que j'utilise sur le bouton provoque ce comportement bizarre. J'ai inclus le style dans la question. Qu'est-ce qui me manque dans le style? Merci beaucoup! –

+0

Voici ce que j'ai fait: 1) Créer un nouveau storyboard appelé DisableDeactivating et définir FillBehavior = "Stop" 2) Ensuite, ajouter un BeginStoryboard pour DisableDeactivating dans le trigger Trigger.ExitActions du trigger IsEnabled = false. –

0

Essayez

<Button IsEnabled={Binding Path=IsGenericUser}" ... /> 

Le Path= ne devrait pas être nécessaire, mais il pourrait faire un differerce.

Et en utilisant le this dans le contexte de données, vous êtes sûr que ce droit? Cela ne ferait-il pas le contrôle lui-même dans le contexte? Je n'ai pas vu le reste de votre code, mais cela ne semble pas correct.

+0

"this" est la classe actuelle. Donc, assigner "this" au DataContext lui assignera la classe en cours (ma fenêtre dans mon cas). La fenêtre a le DP, donc oui, c'est correct. –

0

1) A créé un nouveau story-board appelé DisableDeactivating et définissez la FillBehavior = "Stop" (suggestion de Nicholas) 2) Ensuite, a ajouté un BeginStoryboard pour DisableDeactivating dans les Trigger.ExitActions du IsEnabled = faux déclenchement.

Questions connexes