繁体   English   中英

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

[英]Converter in WPF ListView using cached value as parameter


我有一个管理不同类型文档的应用程序。 在文档管理器中,我在ListView中显示文档。 我创建了一些转换器,以在不弄乱文档类本身的情况下显示文档的特殊aspacts。 列表视图中的一列应显示一个代表文档类型和文档编号的图标。 列应如下所示

 <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用作绑定对象感谢Clemens Hoffmann

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();
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM