将列添加到包含图像的列表视图
我想使用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中显示任何类型(或至少images
和strings
),还是必须使用全新的方式,并且会是这样吗?
编辑:在以前的方法中,有人说,我需要创建一个新的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