【问题标题】:Add column to listview that contains an image将列添加到包含图像的列表视图
【发布时间】:2016-05-15 10:04:10
【问题描述】:

我想使用来自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);
            }

我出于其他目的尝试修改此solution。这个解决方案效果很好,如果我只想添加string 类型的值,但现在我还想在gridview 中显示image,但如果我在gridview 中添加一个,它只会显示:

“System.Windows.Controls.Image”

现在我想知道,我是否可以修改我的代码,以便我可以在 gridview 中显示任何类型(或至少 imagesstrings),或者我是否必须使用全新的方式?怎么走?

编辑:在以前的方法中,据说我需要创建一个新的DataTemplate 来显示图像,但是没有解决方案(Solution 1Solution 2)我发现对我有用。

【问题讨论】:

  • 尝试根据您创建列的循环中的数据类型为列设置CellTemplate。这是为了防止一列总是显示相同类型的数据。如果数据类型可以逐行更改,您可以添加CellTemplateSelector,以便使用正确的模板。
  • 我创建了一个新的DataTemplate 并将DataType 设置为typeof(Image)。我必须设置更多属性吗?因为我仍然得到相同的结果。
  • 我尝试了这些解决方案来创建 DataTemplate:stackoverflow.com/questions/248362/…stackoverflow.com/questions/5471405/…,但它们都不适合我。那么如何创建一个在gridview 中提供imagesDataTemplate

标签: c# wpf image gridview


【解决方案1】:

最好的方法是为资源中的图标列定义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);
        }

    }
}

结果

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-28
      • 2016-04-06
      • 2018-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多