找不到这个答案。
我有一个WPF ListView控件,可以包含不同数量的列。例如,它可以显示客户数据,显示列ID,名称,电子邮件等,或者它可以包含产品,显示ID,名称,价格,NumberInStock,制造商,以及你得到的想法:不同数量的列,不同的名称。
我想要做的是,某些列以不同方式显示数据。例如,我不想打印“是”或“否”作为NumberInStock列的值,而是想显示一个整洁的图像。
如果我有固定数量的列,并且要绑定固定名称,我会看到这很简单。只需为该特定列定义DataTemplate,我就可以使用它来定义列的视图。但是,在我的情况下,我无法看到如何做到这一点。
我对WPF很新,所以请原谅我,如果我的方法不好:-)在我的XAML中,我已经定义了一个ListView控件,它几乎是空的。在我的代码背后,我使用:
// get all columns from my objects (which can be either a Customer of Product)
foreach (string columnName in MyObject.Columns)
{
GridViewColumn column = new GridViewColumn();
// Bind to a property of my object
column.DisplayMemberBinding = new Binding("MyObject." + columnName);
column.Header = columnName;
column.Width = 50;
// If the columnname is number of stock, set the template to a specific datatemplate defined in XAML
if (columnName == "NumberInStock")
column.CellTemplate = (DataTemplate)FindResource("numberInStockImageTemplate");
explorerGrid.Columns.Add(column);
}
好的,我确信这可以做得更漂亮一点(如果你有任何建议,请!)但最大的问题是我看不到专栏中的任何差异。它只显示“NumberInStock”列的文本值。我的DataTemplate在XAML中定义:
<Window.Resources>
<DataTemplate x:Name="NumberInStock" x:Key="NumberInStock">
<Border BorderBrush="Red" BorderThickness="2.0">
<DockPanel>
<Image Width="24" Height="24" Margin="3,0" Source="..\Images\instock.png" />
</DockPanel>
</Border>
</DataTemplate>
</Window.Resources>
当然,我仍然需要添加它会显示“是”或“否”图像的功能,具体取决于NumberInStock的值,但这确实是第2步。我很乐意在ListView中看到图像和红色边框!
提前致谢, 金酸莓
答案 0 :(得分:7)
这使我绊倒了一段时间。
DisplayMemberBinding
和CellTemplate
是互斥的。指定DisplayMemberBinding
会导致CellTemplate
被忽略。
来自MSDN:
以下属性均已使用 定义一个的内容和风格 列单元格,并在此处列出 他们的优先顺序来自 从最高到最低:
* DisplayMemberBinding * CellTemplate * CellTemplateSelector
另请参阅C# Disciples post。
答案 1 :(得分:2)
这是插入图片的最简单方法
GridViewColumn column = new GridViewColumn { Header = "IM" };
DataTemplate template = new DataTemplate();
FrameworkElementFactory factory = new FrameworkElementFactory(typeof(Grid));
template.VisualTree = factory;
FrameworkElementFactory imgFactory = new FrameworkElementFactory(typeof(Image));
Binding newBinding = new Binding("IMG");
imgFactory.SetBinding(Image.SourceProperty,newBinding);
imgFactory.SetValue(Image.WidthProperty,15.0);
imgFactory.SetValue(Image.HeightProperty, 15.0);
factory.AppendChild(imgFactory);
column.CellTemplate = template;
view.Columns.Add(column);
ListViewMain.View = view;
答案 2 :(得分:0)
我认为问题是您传递给FindResource()
的字符串与您在XAML中定义的资源的键不匹配。尝试传递"NumberInStock"
,看看是否有效。