问题描述
是否可以在网格级别定义触发器来更新网格的子属性?
我尝试过类似的方法但没有成功:
视图模型:
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”。
解决方法
是否可以在网格级别定义触发器来更新网格的子属性?
没有。设置 TargetName
的 Setter
仅在 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>