将列添加到包含图像的列表视图

我想使用ExpandoObject数据添加一行,这与Dictionary<string, object>类似。 该string是该列的标题,该object的值是该列的值。 每当我获取新数据时,我都会创建一个新的GridView ,因为列数可能不同。 在List myItems是我想要在我的视图中显示的所有行Dictionary<string, object>

这是我如何将列添加到我的视图:

            List<Column> columns = new List<Column>();

            myItemValues = (IDictionary<string, object>)myItems[0];
            // Key is the column, value is the value
            foreach (var pair in myItemValues)
            {
                Column column = new Column();
                column.Title = pair.Key;
                column.SourceField = pair.Key;
                columns.Add(column);
            }
            view.Columns.Clear();
            foreach (var column in columns)
            {
                Binding binding = new Binding(column.SourceField);
                if (column.SourceField == "Icon")
                {
                    view.Columns.Add(new GridViewColumn
                    {
                        Header = column.Title,
                        DisplayMemberBinding = binding,
                        CellTemplate = new DataTemplate(typeof(Image))
                    });
                }
                else
                {
                    view.Columns.Add(new GridViewColumn { Header = column.Title, DisplayMemberBinding = binding });
                }
            }

直接在此之后,我尝试添加行:

            foreach (dynamic item in myItems)
            {
                this.listView.Items.Add(item);
            }

我尝试修改此解决方案以实现其他目的。 这个解决方案工作得非常好,如果我只想添加类型string值,但现在我也想在gridview中显示image ,但是如果我在gridview中添加一个image ,它只显示我:

“System.Windows.Controls.Image”

现在我想知道,如果我可以修改我的代码,以便我可以在gridview中显示任何类型(或至少imagesstrings ),还是必须使用全新的方式,并且会是这样吗?

编辑:在以前的方法中,有人说,我需要创建一个新的DataTemplate来显示图像,但我找到的解决方案(解决方案1,解决方案2)中没有一个适合我。


最好的方法是为资源中的Icon列定义DataTemplate,然后在为图标创建列时加载它。 我修改了您的代码以显示该方法。

XAML

<Window x:Class="ListViewIcon.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ListViewIcon"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <ResourceDictionary>
            <DataTemplate x:Key="iconTemplate">
                <Image Source="{Binding Icon}"
                   Width="64"
                   Height="64"/>
            </DataTemplate>
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <ListView x:Name="myListView"></ListView>

    </Grid>
</Window>

C#

public class Column
{
    public string Title { get; set; }
    public string SourceField { get; set; }
}

public partial class MainWindow : Window
{
    private BitmapImage LoadImage()
    {
        var img = new BitmapImage();
        img.BeginInit();
        img.UriSource = new Uri(@"D:image.png", UriKind.Absolute);
        img.CacheOption = BitmapCacheOption.OnLoad;
        img.EndInit();

        return img;
    }

    public MainWindow()
    {
        InitializeComponent();

        GridView gridView = new GridView();
        this.myListView.View = gridView;

        List<dynamic> myItems = new List<dynamic>();
        dynamic myItem;
        IDictionary<string, object> myItemValues;

        var image = LoadImage();

        // Populate the objects with dynamic columns
        for (var i = 0; i < 100; i++)
        {
            myItem = new System.Dynamic.ExpandoObject();

            foreach (string column in new string[] { "Id", "Name", "Something" })
            {
                myItemValues = (IDictionary<string, object>)myItem;
                myItemValues[column] = "My value for " + column + " - " + i;
            }

            myItem.Icon = image;

            myItems.Add(myItem);
        }

        // Assuming that all objects have same columns - using first item to determine the columns
        List<Column> columns = new List<Column>();

        myItemValues = (IDictionary<string, object>)myItems[0];

        // Key is the column, value is the value
        foreach (var pair in myItemValues)
        {
            Column column = new Column();

            column.Title = pair.Key;
            column.SourceField = pair.Key;

            columns.Add(column);
        }

        // Add the column definitions to the list view
        gridView.Columns.Clear();

        foreach (var column in columns)
        {

            if (column.SourceField == "Icon")
            {
                gridView.Columns.Add(new GridViewColumn
                {
                    Header = column.Title,
                    CellTemplate = FindResource("iconTemplate") as DataTemplate
                });
            }
            else
            {
                var binding = new Binding(column.SourceField);
                gridView.Columns.Add(new GridViewColumn { Header = column.Title, DisplayMemberBinding = binding });
            }


        }

        // Add all items to the list
        foreach (dynamic item in myItems)
        {
            this.myListView.Items.Add(item);
        }

    }
}

结果

在这里输入图像描述


我怀疑你可以在你使用的方法中使你的解决方案具有通用性。 它适用于具有适合您的有效ToString()表示的基于文本的数据类型。 为了处理像Images这样复杂的数据类型,您可能必须使用Templates,如Shadowed metions,您必须为每个复杂类型设置不同的属性。 例如对于图像,它可能是大小和来源,对于按钮 - 背景颜色。 作为选项,您可以创建某种模板工厂并应用CellTemplateSelector,它将为您提供必要的模板,但正如您所说的那样 - 这是一种全新的方式。

链接地址: http://www.djcxy.com/p/31937.html

上一篇: Add column to listview that contains an image

下一篇: Nunjucks nl2br does not exist?