【问题标题】:Using custom dependency properties as DataTrigger in WPF在 WPF 中使用自定义依赖属性作为 DataTrigger
【发布时间】:2011-01-01 09:52:52
【问题描述】:

我有一个自定义依赖属性,我想将其用作数据触发器。这是后面的代码:

public static readonly DependencyProperty BioinsulatorScannedProperty =
    DependencyProperty.Register(
        "BioinsulatorScanned", 
        typeof(bool), 
        typeof(DisposablesDisplay), 
        new FrameworkPropertyMetadata(false));

    public bool BioinsulatorScanned
    {
        get
        {
            return (bool)GetValue(BioinsulatorScannedProperty);
        }
        set
        {
            SetValue(BioinsulatorScannedProperty, value);
        }
    }

我创建了一个样式和控件模板。我的目标是在依赖属性设置为 true 时更改某些文本的颜色...

<Style x:Key="TreatEye" TargetType="Label">
        <Setter Property="Foreground" Value="#d1d1d1" />
        <Setter Property="FontWeight" Value="Bold" />
        <Setter Property="FontSize" Value="30" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Label">
                    <Canvas>                            
                        <TextBlock x:Name="bioinsulatorText" 
                                   Canvas.Left="21" Canvas.Top="33" 
                                   Text="Bioinsulator" />
                        <TextBlock Canvas.Left="21" Canvas.Top="70" 
                                   Text="KXL Kit" />
                    </Canvas>

                    <ControlTemplate.Triggers>
                        <DataTrigger Binding="{Binding BioinsulatorScanned}"
                                     Value="True">
                            <Setter TargetName="bioinsulatorText" 
                                    Property="Foreground" Value="Black" />
                        </DataTrigger>
                    </ControlTemplate.Triggers>

                </ControlTemplate>
            </Setter.Value>
        </Setter>            
    </Style>

尽管以编程方式成功地将依赖项属性设置为 true,但此触发条件永远不会触发。这是一个真正的调试痛苦!

提前致谢。

【问题讨论】:

  • 你在哪个对象上定义了你的依赖属性?
  • 我不确定我是否完全理解,但我正在尝试使用 ControlTemplate.Triggers 部分中的依赖属性。如果是真的,我需要“bioinsulatorText”中的文本变黑。

标签: wpf properties dependencies datatrigger


【解决方案1】:

在这种情况下,我使用基于依赖属性 FirstLevelProperty 的数据触发器来切换按钮的可见性。

public static readonly DependencyProperty FirstLevelProperty = DependencyProperty.Register("FirstLevel", typeof(string), typeof(MyWindowClass));

public string FirstLevel
        {
            get
            {
                return this.GetValue(FirstLevelProperty).ToString();
            }

            set
            {
                this.SetValue(FirstLevelProperty, value);
            }
        }

您可以使用RelativeSource 绑定来引用包含在窗口中(在这种情况下)的依赖属性FirstLevel(Property)。您还应该在样式中设置默认设置,该设置将被数据触发器覆盖。

<Button.Style>
    <Style TargetType="Button">
        <Style.Triggers>
            <DataTrigger 
             Binding="{Binding Path=FirstLevel,
             RelativeSource={RelativeSource FindAncestor,
             AncestorType={x:Type Window}}}" 
             Value="SomeValue">
                <Setter Property="Visibility" 
                 Value="Hidden" />
             </DataTrigger>
        </Style.Triggers>
        <Setter Property="Visibility" Value="Visible" />
    </Style>
</Button.Style>

【讨论】:

    【解决方案2】:

    看起来您的依赖属性是在您创建的DisposableDisplay 对象中定义的。为了使指定的绑定起作用,必须将 DisposableDisplay 对象的实例设置为控件(在本例中为标签)或其任何祖先的 DataContext

    【讨论】:

    • 这非常有效。作为 WPF 新手,我发现数据绑定是最麻烦的话题之一。哪些情况下不需要设置DataContext?
    • DataContext 在您使用数据模板时默认设置。在项目控件(列表框、列表视图、数据网格等)中默认使用数据模板。此外,您可以在任何元素上显式设置数据上下文以更好地促进绑定。它是 WPF 中最重要的概念之一。
    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多