将StaticResource,自身和父级属性传递给转换器

时间:2018-07-17 13:40:21

标签: c# xaml parameters converter

我想创建一个IValueConverter来计算每个GridViewColumn的宽度。

我制作了以下ListView.Resources:

<ListView.Resources>
    <Specialized:ListDictionary x:Key="parametersWidth">
        <sys:String x:Key="ID">25</sys:String>
        <sys:String x:Key="Name">*</sys:String>
        <sys:String x:Key="Description">*</sys:String>
        <sys:String x:Key="Value">*</sys:String>
    </Specialized:ListDictionary>
</ListView.Resources>

想法是将此ListDictionary作为参数传递给Converter, 并将GridViewHeader作为值。

GridViewHeader包含属性“ ActualIndex”,从而可以在“字典”中查找它。

在我的GridView中隐藏我的代码:

<GridView.ColumnHeaderContainerStyle>
    <Style TargetType="{x:Type GridViewColumnHeader}">
        <Setter Property="Width" Value="{Binding Path=., Converter={StaticResource WidthConverter}, ConverterParameter={StaticResource parametersWidth}}"/>
    </Style>
</GridView.ColumnHeaderContainerStyle>

在这种情况下,我的Converter正在运行,字典可以正确传递,但是值是Window的数据上下文。

我试图将其更改为:

<GridView.ColumnHeaderContainerStyle>
    <Style TargetType="{x:Type GridViewColumnHeader}">
        <Setter Property="Width" Value="{Binding RelativeSource={RelativeSource Self}, Path=Value, Converter={StaticResource WidthConverter}, ConverterParameter={StaticResource parametersWidth}}"/>
    </Style>
</GridView.ColumnHeaderContainerStyle>

但随后不再调用该转换器...

所以我有2个问题:

  1. 如何将GridViewColumn作为值传递给转换器?

  2. 转换器如何知道GridView / ListView的总宽度?

我可以从GridViewColumn导航到GridView / ListView知道宽度吗?

1 个答案:

答案 0 :(得分:0)

好吧,感谢mm8,看来multivalueconverter是解决方案。

但是我仍然有一个问题...

现在,我的IValueConverter获取了所需的所有数据,并进行了宽度的计算,但它也将其返回(作为两倍),但是...视图未更新。...

请注意我的xaml宽度:

<GridView.ColumnHeaderContainerStyle>
    <Style TargetType="{x:Type GridViewColumnHeader}">
        <Setter Property="Width">
            <Setter.Value>
                <MultiBinding Converter="{StaticResource WidthConverter}" Mode="TwoWay">
                    <Binding RelativeSource="{RelativeSource Mode=Self}"/>
                    <Binding Source="{StaticResource parametersWidth}"/>
                    <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type ListView}, AncestorLevel=1}" Path="ActualWidth"/>
                </MultiBinding>
            </Setter.Value>
        </Setter>
</GridView.ColumnHeaderContainerStyle>