基于DependencyProperty控制样式

时间:2011-10-20 11:32:08

标签: c# wpf data-binding mvvm dependency-properties

因此,我正在使用M-V-VM设计模式制作WPF应用程序,并且在使我的Bindings正常工作时遇到一些麻烦。

我有一个自定义的ToggleButton,我希望它的工作方式是:

  1. 当控件的IsChecked属性设置为true时,它应该查询第二个布尔值(包含在ViewModel中)也是如此。
  2. 如果是,请将背景颜色设置为一种颜色,否则将其设置为其他颜色。
  3. 如果IsChecked为false,请使用标准颜色。
  4. 在xaml中,我有这种风格:

    <Style TargetType="{x:Type ToggleButton}" BasedOn="{StaticResource CustomisableToggleButton}" x:Key="ValidatedTButton">
        <Style.Triggers>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding IsChecked}" Value="True" />
                    <Condition Binding="{Binding IsValid}" Value="True" />
                </MultiDataTrigger.Conditions>
                <MultiDataTrigger.Setters>
                    <Setter Property="Background" Value="Turquoise" />
                </MultiDataTrigger.Setters>
            </MultiDataTrigger>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding IsChecked}" Value="True" />
                    <Condition Binding="{Binding IsValid}" Value="False" />
                </MultiDataTrigger.Conditions>
                <MultiDataTrigger.Setters>
                    <Setter Property="Background" Value="LightCoral" />
                </MultiDataTrigger.Setters>
            </MultiDataTrigger>
            <DataTrigger Binding="{Binding IsChecked}" Value="False">
                <Setter Property="Background" Value="AliceBlue" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
    

    (CustomisableToggleButton是一个适用于ToggleButtons的所有样式 - AFAIK这应该覆盖其中固有的触发器 - 如果我错了就纠正我)

    在控制类中:

    public class ValidatedToggleButton : ToggleButton
    {
        public ValidatedToggleButton()
            : base() { }
    
        public static readonly DependencyProperty IsValidProperty = DependencyProperty.Register(
            "IsValid", typeof(bool), typeof(ValidatedToggleButton));
    
        public bool IsValid
        {
            get { return (bool)GetValue(IsValidProperty); }
            set { SetValue(IsValidProperty, value); }
        }
    }
    

    控件的实际实现是:

    <Window
    <!--standard window properties-->
        xmlns:cc="clr-namespace:MVVM.CustomControls"> // namespace where 'ValidatedToggleButton' resides
    
    <!--other XAML code-->
    
        <cc:ValidatedToggleButton 
            IsValid="{Binding Boolean1}" 
            Content="ToggleButton1" 
            IsChecked="{Binding ToggleButton1Checked}" 
            Grid.Row="6" Style="{StaticResource ValidatedTButton}" />
    
    </Window>
    

    现在,问题是,它在启动时从不检查'Boolean1'值(使用断点验证)。如何在每次按下控件时检查该值?

2 个答案:

答案 0 :(得分:2)

<Condition Binding="{Binding IsChecked}" Value="True" />

这是在您的视图模型(您的数据上下文)上查找名为IsChecked的属性。你确定你不想要这个:

<Condition Binding="{Binding IsChecked, RelativeSource={RelativeSource Self}}" Value="True" />

答案 1 :(得分:1)

除了修复XAML绑定的Kent's Answer之外,请确认PropertyChanged更改后Boolean1事件被引发。

您可以通过在get方法中插入断点来完成此操作。