WPF IsEnabled Bindung an DependencyProperty nicht richtig funktioniert
Habe ich eine dependency property definiert, die in meinem Fenster, wie unten:
public static readonly DependencyProperty IsGenericUserProperty = DependencyProperty.Register("IsGenericUser", typeof (bool), typeof (MainWindow));
public bool IsGenericUser
{
get { return (bool) GetValue(IsGenericUserProperty); }
set { SetValue(IsGenericUserProperty, value); }
}
Auf meinem Fenster Konstruktor ich die Daten Kontext des Containers ein, halten Sie die Taste:
QuickListButtonsStackPanel.DataContext = this;
Bin ich verbindlich die Abhängigkeitseigenschaft, für die IsEnabled-Eigenschaft einer Schaltfläche:
<Button IsEnabled="{Binding IsGenericUser}" .../>
Beim Start IsGenericUser wahr ist, so wird die Schaltfläche aktiviert. Wenn ich IsGenericUser auf false, wird der button deaktiviert. Allerdings, wenn ich IsGenericUser wieder wahr, nichts passiert auf den Knopf und es bleibt deaktiviert.
Was mache ich falsch?
Dank!
Bearbeiten:
Hier ist der Stil, den ich bin mit mit der-Taste. Dieser Stil wird das Problem verursacht (wenn die Taste hat keinen eigenen Stil, es funktioniert):
<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>
Gibt es sonst noch etwas, das Ziel ist, die Taste? Legen Sie alle Eigenschaften, die durch code oder gelten keine Animationen?
Ja, ich weiß gelten die Animationen auf die Schaltfläche Stil. Das ist wahrscheinlich das, was die causingthe Problem. Wenn ich don ' T verwenden Sie die Schaltfläche Stil, hat alles Prima funktioniert.
Hat deine Taste einen Befehl? Wenn der Befehl die CanExecute false " zurückgibt (oder Sie nicht Benachrichtigen, dass CanExecute geändert hat), ist die Taste deaktiviert.
Nein, es gibt keine Befehle. Danke.
InformationsquelleAutor Gus Cavalcanti | 2009-06-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie sind Sie mit der Einstellung der Eigenschaft auf False/True? Wenn ich kopiere deinen code in als-ist, es funktioniert perfekt. Es muss etwas anderes passiert sein, dass Sie können nicht erwarten, dass Sie wirksam werden zu lassen, wie eine animation auf die Schaltfläche, oder etwas, das clearing der Bindung. Gibt es noch mehr code, den Sie veröffentlichen können, kann helfen, zu klären, was sein könnte, dies zu tun?
Hier ist der code, den ich auch getestet:
BEARBEITEN:
Können Sie fügen Sie ein Textfeld, um zu sehen, ob es funktioniert,
Wie es aussieht, das problem ist nur, das mit dem Stil ist storyboards, wenn Sie hinzufügen, dass, es funktioniert noch zeigen, dass die IsEnabled-Eigenschaft der Wert false, wenn es nicht sein sollte?
Dies ist, was ich getan habe: 1) Erstellt eine neue storyboard genannt DisableDeactivating und legen Sie die FillBehavior="Stop" 2) Dann Hinzugefügt, BeginStoryboard für DisableDeactivating in den Trigger.ExitActions der IsEnabled = false auslösen.
InformationsquelleAutor rmoore
Versuchen
Den
Path=
sollte nicht erforderlich sein, aber es könnte ein differerce.Und mit der
this
in den Daten-Kontext, sind Sie sicher, dass das stimmt? Würde nicht machen, dass die Kontrolle sich auf den Rahmen. Ich habe nicht gesehen, den rest von deinem code, aber das scheint einfach nicht richtig.InformationsquelleAutor Jarrett Meyer
1) Erstellt ein neues storyboard genannt DisableDeactivating und legen Sie die FillBehavior="Stop" (Nikolaus' Vorschlag)
2) Dann Hinzugefügt, BeginStoryboard für DisableDeactivating in den Trigger.ExitActions der IsEnabled = false auslösen.
InformationsquelleAutor Gus Cavalcanti