如何以样式访问控件父级的属性

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”。 好的,让它工作......谢谢......现在工作...... MultiDataTrigger.Conditions>【参考方案2】:

ListView 有单独的SelectedItemTemplate。所以你可以使用它。

【讨论】:

【参考方案3】:

为了节省您的时间,发布对我和 OP 都有效的语法: 绑定RelativeSource=RelativeSource AncestorType=x:Type ParentType, Path=ParentProperty

【讨论】:

以上是关于如何以样式访问控件父级的属性的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Angular 11 中访问两个父级的路由参数?

PHP在父级中访问子级的私有属性

如何有效地通过 React 中父级的引用访问子级?

访问父级的受保护变量

Java - 为啥另一个包中的子级无法通过父级引用访问父级的受保护方法?

从嵌套类的函数访问父级的非静态成员