2009-06-08 5 views
3

작동하지 DependencyProperty에 바인딩 :WPF의 IsEnabled 내가 종속성 속성은 다음과 같이 내 방 창문에서 정의한 제대로

: 나는 버튼을 누른 컨테이너의 데이터 컨텍스트를 설정 내 방 창문의 생성자에
public static readonly DependencyProperty IsGenericUserProperty = DependencyProperty.Register("IsGenericUser", typeof (bool), typeof (MainWindow)); 
public bool IsGenericUser 
{ 
    get { return (bool) GetValue(IsGenericUserProperty); } 
    set { SetValue(IsGenericUserProperty, value); } 
} 

QuickListButtonsStackPanel.DataContext = this; 

나는 버튼의 IsEnabled 속성에 종속성 속성을 바인딩 오전 :

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

시작시 IsGenericUser가 true이므로 버튼이 활성화됩니다. IsGenericUser를 false로 설정하면 버튼이 비활성화됩니다. 그러나 IsGenericUser를 다시 true로 설정하면 버튼에 아무런 변화가 없으며 비활성화 된 상태로 유지됩니다. 내가 뭘 잘못하고 있니?

감사합니다.

편집 : 다음은 버튼과 함께 사용하는 스타일입니다. 이 스타일로 인해 문제가 발생합니다 (버튼에 맞춤 스타일이 없으면 제대로 작동합니다).

<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

죄송합니다. 모든 테스트 프로젝트에서 위에서 설명한 모든 것을 사용하면 문제가 없습니다. 내 프로젝트와 관련된 다른 것이 잘못되었을 수 있습니다. –

+1

해당 버튼을 대상으로하는 것이 있습니까? 코드를 통해 속성을 설정하거나 애니메이션을 적용합니까? – rmoore

+0

예, 버튼의 스타일에 애니메이션을 적용합니다. 그게 문제의 원인 일거야. 버튼 스타일을 사용하지 않으면 잘 작동합니다. –

답변

5

속성을 False/True로 설정하는 방법은 무엇입니까? 있는 그대로 코드를 복사하면 완벽하게 작동합니다. 단추에 애니메이션을 적용하거나 바인딩을 지우는 것과 같은 효과를 기대하지 않을 수있는 다른 작업이 있어야합니다. 이 작업을 수행 할 수있는 코드를 명확히하는 데 도움이 될 수있는 코드를 게시 할 수 있습니까?

<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; 
    } 
} 

편집 :

여기뿐만 아니라 테스트 코드는 당신은 그것이 작동하는지 확인뿐만 아니라 텍스트 상자를 추가 할 수

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

문제는 스타일의 스토리 보드에있는 것처럼 보입니다. 추가하는 경우 문제가 계속 표시됩니다. IsEnabled가 거짓 일 때 거짓일까요?

+0

감사합니다. rmoore. 당신 말이 맞아요. 제가 버튼에 사용하는 스타일이 이상한 행동을 일으키는 것입니다. 질문에 스타일을 포함 시켰습니다. 나는 스타일에서 무엇을 놓치고 있습니까? 감사합니다. –

+0

이것은 내가 한 일입니다. 1) DisableDeactivating이라는 새로운 스토리 보드를 만들고 FillBehavior = "Stop"을 설정합니다. 2) 그런 다음 IsEnabled = false 트리거의 Trigger.ExitActions에 DisableDeactivating 용 BeginStoryboard를 추가했습니다. –

0

Path=이 필요하지 말아야
<Button IsEnabled={Binding Path=IsGenericUser}" ... /> 

을 시도하지만, 그것은 differerce을 할 수 있습니다.

그리고 데이터 컨텍스트에서 this을 사용하는 것이 맞습니까? 컨텍스트 자체를 제어하지 않을까요? 나머지 코드는 보지 못했지만, 그럴 것 같지 않습니다.

+0

"this"는 현재 클래스입니다. 그래서, "this"를 DataContext에 할당하면 현재 클래스가 할당됩니다 (필자의 경우 내 윈도우). 창문에 DP가 있기 때문에 맞습니다. –

0

1) DisableDeactivating라는 새로운 스토리 보드 생성되고이 FillBehavior = "정지"로 설정 (니콜라스 제안) 2) 다음에,의 IsEnabled = 거짓 트리거 Trigger.ExitActions DisableDeactivating에 대한 추가 BeginStoryboard.