设置网格子属性的网格级别触发器

问题描述

是否可以在网格级别定义触发器来更新网格的子属性

我尝试过类似的方法但没有成功:

视图模型:

public class Myviewmodel
{
    public bool PropertyA {get;set;}
    public bool PropertyB {get;set;}
}

(为了简洁起见,我省略了所有 PropertyChanged 的​​内容

XAML:

<Grid>
    <Grid.RowDeFinitions>
        <RowDeFinition Height="auto"/>
        <RowDeFinition Height="auto"/>
    </Grid.RowDeFinitions>

    <TextBlock x:Name="ControlA" Grid.Row="0" />

    <TextBlock x:Name="ControlB" Grid.Row="1" />

    <Grid.Triggers>
        <!-- Condition A -->
        <multidatatrigger>
            <multidatatrigger.Conditions>
                <Condition Binding="{Binding PropertyA}" Value="false"/>
                <Condition Binding="{Binding PropertyB}" Value="true"/>
            </multidatatrigger.Conditions>
            <multidatatrigger.Setters>
                <Setter TargetName="ControlA" Property="Text" Value="Blah"/>
                <Setter TargetName="ControlB" Property="Text" Value="Blah"/>
            </multidatatrigger.Setters>
        </multidatatrigger>
        <!-- Conditon B -->
        <multidatatrigger>
             <multidatatrigger.Conditions>
                <Condition Binding="{Binding PropertyA}" Value="false"/>
                <Condition Binding="{Binding PropertyB}" Value="false"/>
            </multidatatrigger.Conditions>
            <multidatatrigger.Setters>
                <Setter TargetName="ControlA" Property="Text" Value="Blah"/>
                <Setter TargetName="ControlB" Property="Text" Value="Blah"/>
            </multidatatrigger.Setters>
        </multidatatrigger>
        <!-- Condition C -->
        <DataTrigger Binding="{Binding PropertyA}" Value="true">
             <Setter TargetName="ControlA" Property="Text" Value="Blah"/>
             <Setter TargetName="ControlB" Property="Text" Value="Blah"/>
        </DataTrigger>
    </Grid.Triggers>
</Grid>

但是编译器抱怨

无法识别名称“ControlA”。

无法识别名称“ControlB”。

无法识别或无法访问成员“Text”。

无法识别或无法访问成员“Text”。

解决方法

是否可以在网格级别定义触发器来更新网格的子属性?

没有。设置 TargetNameSetter 仅在 ControlTemplate 中存在具有匹配名称的元素时才有意义。

一般来说,Setter 只能设置应用样式或触发器的元素的属性。

您应该做的是创建一个带有 TextBlock(s) 触发器的样式,例如:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="auto"/>
        <RowDefinition Height="auto"/>
    </Grid.RowDefinitions>
    <Grid.Resources>
        <Style TargetType="TextBlock">
            <Style.Triggers>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding PropertyA}" Value="false"/>
                        <Condition Binding="{Binding PropertyB}" Value="true"/>
                    </MultiDataTrigger.Conditions>
                    <MultiDataTrigger.Setters>
                        <Setter Property="Text" Value="Blah"/>
                    </MultiDataTrigger.Setters>
                </MultiDataTrigger>
            </Style.Triggers>
        </Style>
    </Grid.Resources>

    <TextBlock x:Name="ControlA" Grid.Row="0" />

    <TextBlock x:Name="ControlB" Grid.Row="1" />

</Grid>