【问题标题】:Grid level triggers that set grid's child properties设置网格的子属性的网格级别触发器
【发布时间】:2021-06-28 14:42:53
【问题描述】:

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

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

视图模型:

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”无法识别或无法访问。

【问题讨论】:

    标签: wpf xaml datatrigger


    【解决方案1】:

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

    没有。设置 SetterTargetName 仅在存在具有匹配名称的元素的 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>
    

    【讨论】:

    • 我已经考虑过您的解决方案(并且可能会将其标记为答案),但这意味着我必须为我的 Grid 中的每个 TextBlock 定义一个样式(因为每个 TextBlock 都是在因条件而异)。这意味着在每种风格中重复整个触发内容。有点多余......但我想我没有选择......而且我有两个以上的TextBlock T_T。
    • 如果不同的逻辑适用于不同的TextBlocks,那么很遗憾。
    猜你喜欢
    • 2012-11-23
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2020-11-11
    相关资源
    最近更新 更多