Запуск стиля кнопки WPF при изменении свойства зависимости - PullRequest
0 голосов
/ 01 апреля 2011

Я создал шаблон управления кнопкой, в котором я хочу изменить цвет кнопки в зависимости от режима кнопки (будь то в режиме Go или в режиме Stop). XAML выглядит так:

                        </LinearGradientBrush>
                    </Ellipse.Fill>
                </Ellipse>
                <Ellipse x:Name="innerCircle" RenderTransformOrigin=".5,.5">
                    <Ellipse.RenderTransform>
                        <ScaleTransform ScaleX=".8" ScaleY=".8"/>
                    </Ellipse.RenderTransform>
                    <Ellipse.Fill>
                        <LinearGradientBrush  StartPoint="0,0" EndPoint="0,1">
                            <GradientStopCollection>
                                <GradientStop Offset="0" Color="Green"/>
                                <GradientStop Offset="1" Color="Transparent"/>
                            </GradientStopCollection>

                        </LinearGradientBrush>
                    </Ellipse.Fill>
                </Ellipse>
                <Viewbox>
                    <ContentPresenter Margin="{TemplateBinding Padding}"/>
                </Viewbox>
            </Grid>
            <ControlTemplate.Triggers>
                <DataTrigger Binding="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsGo}" Value="True">
                    <Setter TargetName="outerCircle" Property="Fill">
                        <Setter.Value>
                            <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
                                <GradientStopCollection >
                                    <GradientStop Offset="0" Color="White"/>
                                    <GradientStop Offset="1" Color="Red"/>
                                </GradientStopCollection>

                            </LinearGradientBrush>
                        </Setter.Value>
                    </Setter>
                    <Setter TargetName="innerCircle" Property="Fill">
                        <Setter.Value>
                            <LinearGradientBrush  StartPoint="0,0" EndPoint="0,1">
                                <GradientStopCollection>
                                    <GradientStop Offset="0" Color="Red"/>
                                    <GradientStop Offset="1" Color="Transparent"/>
                                </GradientStopCollection>

                            </LinearGradientBrush>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>

            </ControlTemplate.Triggers>
        </ControlTemplate>
    </Grid.Resources>        
        <Button Background="Transparent" Content="STOP" Padding="10" Template="{StaticResource buttonTemplate}" Height="84" Width="87" Click="Button_Click"></Button>       
</Grid>

В моем DataTrigger у меня есть привязка к свойству IsGo DP, которое я определил в коде позади (типа boolean). У меня есть обработчик кликов, который переключает состояние этого DP в коде:

  /// <summary>
    /// Interaction logic for GoButton.xaml
    /// </summary>
    public partial class GoButton
    {
        public GoButton()
        {
            InitializeComponent();
        }

        public static readonly DependencyProperty IsGOProperty = DependencyProperty.Register("IsGo", typeof(Boolean), typeof(GoButton), new PropertyMetadata(false));

        public Boolean IsGo
        {
            get { return (Boolean)GetValue(IsGOProperty); }
            set { SetValue(IsGOProperty, value); }
        }

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

Однако, когда я нажимаю кнопку, ничего не происходит - хотя код обработчика щелчка выполняется и переключает свойство DP, цвет кнопки остается зеленым и не меняется на красный. Есть идеи, что я делаю не так?

спасибо

Ответы [ 2 ]

1 голос
/ 01 апреля 2011

Вам необходимо вызвать свойство зависимости для обновления.Вы можете сделать это, внедрив INotifyPropertyChanged, удалив IsGOProperty и затем внедрив IsGo следующим образом:

private bool _isgo = false;
public bool IsGo {
    get
    {
        return _isgo;
    }
    set
    {
        _isgo = value;
        PropertyChanged(new PropertyChangedEventArgs("IsGo");
    }
}
0 голосов
/ 01 апреля 2011

Ваш TemplatedParent - это (я предполагаю) кнопка, которую вы создаете.Код, за которым вы определили свое свойство, скорее всего, не элемент управления, полученный из кнопки, поэтому я предполагаю, что привязка вашего триггера неверна ...

Если бы вы могли опубликоватьостальная часть вашего XAML и / или подтверждение того, в каком коде находится ваша собственность, это можно подтвердить.

РЕДАКТИРОВАТЬ: Ваш комментарий подтверждает мою теорию: вы привязываетесь к TemplatedParent, носвойство не на TemplatedParent, оно в вашем пользовательском контроле.Простое решение - добавить тег x:Name="root" в корневой элемент UserControl, а затем изменить привязку триггера на {Binding ElementName=root, Path=IsGo}.

...