当依赖项属性更改时触发WPF按钮的样式

时间:2011-04-01 11:22:05

标签: wpf controltemplate

我已经创建了一个按钮控制模板,我想根据按钮的模式(无论是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 个答案:

答案 0 :(得分:1)

您需要触发依赖项属性进行刷新。你可以通过实现INotifyPropertyChanged,删除IsGOProperty然后像这样实现IsGo来实现这一点:

private bool _isgo = false;
public bool IsGo {
    get
    {
        return _isgo;
    }
    set
    {
        _isgo = value;
        PropertyChanged(new PropertyChangedEventArgs("IsGo");
    }
}

答案 1 :(得分:0)

你的TemplatedParent是(我猜)你正在模板化的按钮。你最有可能定义你的属性的代码隐藏不是从按钮派生的控件,所以我猜你的触发器的绑定是不正确的......

如果您可以发布剩余的XAML和/或确认您的财产所在的代码,则可以确认。

编辑:您的评论确认了我的理论:您绑定到TemplatedParent但该属性不在TemplatedParent上,而是在您的用户控件上。最简单的解决方案是在x:Name="root"的根元素中添加UserControl标记,然后将触发器的绑定更改为{Binding ElementName=root, Path=IsGo}