Datatriggers访问并设置子控件

时间:2017-03-05 22:02:28

标签: c# wpf vb.net xaml user-controls

我的UserControl有两个自定义属性CustomACustomB。我想在Label内的UserControl控件中使用DataTriggers来更改这些自定义属性的Value

在我的示例中,我似乎或者不知道如何访问Setter中的CustomB属性,以便我可以更改它{{1当Value Value属性在DataTrigger中发生变化时。我认为CustomA属性的绑定是正确的,但我不知道如何使用Setter来访问CustomA

总结一下,我需要知道如何从控件的Style DataTriggers中访问属于我的CustomB的自定义属性 - 在本例中为UserControl - 以及改变他们的价值观

UCLabel.xaml - UserControl

Label

UCLabel.xaml.vb - 背后的代码

<UserControl x:Class="UCLabel"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:TestProgram"
         mc:Ignorable="d"
         d:DesignHeight="30" d:DesignWidth="100">

<Label Name="lbl">
    <Label.Style>
        <Style TargetType="{x:Type Label}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, Path=CustomA}" Value="True">
                    <Setter Property="CustomB" Value="False"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Label.Style>
</Label>
</UserControl>

1 个答案:

答案 0 :(得分:0)

在Style中使用Setter时,意味着更改当前控件的属性(在您的情况下,它是Label),并且不能更改任何其他控件的属性。但是,您可以通过Behaviors实现目标。

首先,您需要将以下程序集引用添加到项目中:

System.Windows.Interactivity
Microsoft.Expression.Interactions

然后使用以下代码:

<UserControl
    x:Name="uc"
    xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

    <Label>
        <i:Interaction.Triggers>
            <ei:DataTrigger Binding="{Binding ProA, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}" Value="True">
                <ei:ChangePropertyAction
                    PropertyName="ProB"
                    TargetName="uc"
                    Value="True" />
            </ei:DataTrigger>
        </i:Interaction.Triggers>
    </Label>