如何以样式访问控件父级的属性
Posted
技术标签:
【中文标题】如何以样式访问控件父级的属性【英文标题】:How to access controls parent's property in a style 【发布时间】:2013-04-20 06:49:09 【问题描述】:我的列表视图将项目数据模板化为标签。我正在为该标签设计一种样式,但我不知道如何访问父级的 (ListViewItem) IsSelected 属性。
编辑 - 尝试了以下建议,但仍然出现异常,这是我的完整代码:
<Style x:Key="ListViewItemStyle" TargetType="ListViewItem">
<Setter Property="SnapsToDevicePixels" Value="true"/>
<Setter Property="OverridesDefaultStyle" Value="true"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListViewItem">
<Border BorderBrush="TemplateBinding BorderBrush" BorderThickness="TemplateBinding BorderThickness" Background="TemplateBinding Background" Padding="TemplateBinding Padding" SnapsToDevicePixels="true">
<GridViewRowPresenter HorizontalAlignment="TemplateBinding HorizontalContentAlignment" SnapsToDevicePixels="TemplateBinding SnapsToDevicePixels" VerticalAlignment="TemplateBinding VerticalContentAlignment"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="StaticResource WindowBorderBrush"/>
<Setter Property="Foreground" Value="White"/>
</Trigger>
</Style.Triggers>
</Style>
<Style x:Key="GVLabelStyle"
BasedOn="StaticResource LabelStyle"
TargetType="Label">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Property="Binding Path=IsSelected, RelativeSource=RelativeSource FindAncestor" Value="True"/>
</MultiDataTrigger.Conditions>
<Setter Property="Foreground" Value="White"/>
</MultiDataTrigger>
</Style.Triggers>
</Style>
<DataTemplate x:Key="appTemplate">
<Label Style="StaticResource GVLabelStyle"
Content="Binding ProcessInfo.ProcessName">
</Label>
</DataTemplate>
<ListView Background="Transparent"
Name="mainContentHolder"
ItemsSource="Binding"
BorderBrush="Transparent"
ItemContainerStyle="StaticResource ListViewItemStyle">
<ListView.View>
<GridView ColumnHeaderContainerStyle="StaticResource HeaderStyle">
<GridViewColumn Header="Application"
CellTemplate="StaticResource appTemplate"/>
<GridViewColumn Header="Window Title"
CellTemplate="StaticResource wndTemplate"
Width="300"/>
<GridViewColumn Header="Date"
CellTemplate="StaticResource dateTemplate"/>
</GridView>
</ListView.View>
</ListView>
【问题讨论】:
【参考方案1】:你应该可以使用RelativeSource:
<Condition Property="Binding Path=IsSelected, RelativeSource=RelativeSource TemplatedParent" Value="True" />
编辑:
尝试使用MultiDataTrigger
而不是MultiTrigger
。检查this。
【讨论】:
我试过了,但得到了这个异常:不能在“条件”类型的“属性”属性上设置“绑定”。只能在 DependencyObject 的 DependencyProperty 上设置“绑定”。 我想你可以使用RelativeSource=RelativeSource FindAncestor
来找到确切的ListView?
这样我得到了以下异常:'System.Windows.Data.RelativeSource'的初始化引发了异常。行号“38”和行位置“37”。
好的,让它工作......谢谢......现在工作...... ListView
有单独的SelectedItemTemplate
。所以你可以使用它。
【讨论】:
【参考方案3】:为了节省您的时间,发布对我和 OP 都有效的语法: 绑定RelativeSource=RelativeSource AncestorType=x:Type ParentType, Path=ParentProperty
【讨论】:
以上是关于如何以样式访问控件父级的属性的主要内容,如果未能解决你的问题,请参考以下文章