【问题标题】:Controlling a style based on a DependencyProperty基于 DependencyProperty 控制样式
【发布时间】:2011-10-20 11:32:08
【问题描述】:

所以,我正在使用 M-V-VM 设计模式制作 WPF 应用程序,但在让绑定正常工作时遇到了一些麻烦。

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

  1. 当控件的 IsChecked 属性设置为 true 时,它​​应该查询第二个布尔值(包含在 ViewModel 中)也为 true。
  2. 如果是,则将背景颜色设置为一种颜色,如果不是,则将其设置为另一种颜色。
  3. 如果 IsChecked 为 false,请使用标准颜色。

在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”值(使用断点验证)。如何让它在每次按下控件时检查该值?

【问题讨论】:

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


    【解决方案1】:
    <Condition Binding="{Binding IsChecked}" Value="True" />
    

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

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

    【讨论】:

    • 我确实错过了,但不幸的是没有雪茄。无论如何,“IsChecked”似乎工作正常,只是“IsValid”似乎导致了问题。
    • 接受这个答案并将其应用于 'IsValid' 产生了一个有趣的结果 - 现在 ToggleButton 总是显示为无效颜色而不是有效颜色......奇怪。
    • @KristianFenn 对IsValid 属性做同样的事情。现在看起来你正在检查ValidatingToggleButton.DataContext.IsValid 的值,我猜它不存在。通过将RelativeSource 设置为Self,您将其更改为查看ValidatingToggleButton.IsValid
    • @KristianFenn 抱歉,我没看到。您已验证 DataContext 上的 Boolean1 属性设置为 true 并引发 PropertyChanged 事件?
    • @Rachel 属性 'Boolean1' 没有遵循普通的公共属性来公开私有成员模式 - 它返回比较的结果。因此,该属性没有 set{} 部分,因为没有要设置的私有成员。
    【解决方案2】:

    除了修复 XAML 绑定的 Kent's Answer 之外,还要验证 PropertyChanged 事件是否在 Boolean1 发生变化时引发。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-16
      • 2012-05-09
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多