WPF ListView中的转换器使用缓存值作为参数

时间:2014-02-04 14:01:19

标签: c# wpf listview


我有一个管理不同类型文件的应用程序。 在文档管理器中,我在ListView中显示文档。 我已经创建了一些转换器来显示文档的特殊方法而不会弄乱文档类本身。 列表视图中的一列应显示代表文档类型和文档编号的图标。列应该看起来像

<icon> D  1
<icon> D 11
...

文件编号应向左填充以适合最大数字。

目前我有一个转换器可以创建所需的术语

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
D{
    System.Windows.Controls.ListView view = (System.Windows.Controls.ListView)parameter;
    int count = (view.Items.Count.ToString().Count());
    string id = "D" + value.ToString().PadLeft(count);
    return id;
}

转换器用于CellTemplate,其中转换器参数是listview本身

<TextBlock Text="{Binding Number, Converter={StaticResource docIDConverter}, ConverterParameter={x:Reference Documents}}" />

我知道项目中的文档数量,并且可以将其作为我的窗口类的属性

    /// <summary>
    /// The amount of documents contained in a project
    /// </summary>
    int documentCount = 0;
    public int DocumentCount {
        get { 
            if(this.documentCount == 0)
                documentCount = Project.Documents.Count;
            return documentCount;
        }
    }

这有效,但我认为这是一种糟糕的风格,在大型名单上可能会很慢。

如何使用属性DocumentCount作为转换器的参数。 要么 如何在多值转换器中使用属性DocumentCount作为绑定 谢谢     克莱门斯霍夫曼

1 个答案:

答案 0 :(得分:1)

ConverterParameters不是依赖项属性。因此,您无法绑定它们。但是你可以使用多重绑定来获得相同的效果:

<Style TargetType="FrameworkElement">
    <Setter Property="Text">
        <Setter.Value>
            <MultiBinding Converter="{StaticResource docIDConverter}">
                <Binding Path="DocumentCount" RelativeSource="RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}"/>
            </MultiBinding>
        </Setter.Value>
    </Setter>
</Style>

多值转换器现在获取一个源值数组作为输入:

public class AccessLevelToVisibilityConverter : IMultiValueConverter {
    public object Convert(
            object[] values, Type targetType, object parameter, CultureInfo culture)
       {
            int count = values.All(v => (v is int);
            string id = "D" + values.All(v => (v is TypeYouAreExpectingHere).ToString().PadLeft(count);
            return id;
        }

        public object[] ConvertBack(
            object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotSupportedException();
        }
    }