我正在使用WPF Toolkit中的DataGrid - 最新版本。但是下面的代码不起作用
XAML代码
<dg:DataGrid
Grid.Row="1"
Name="eventLogGrid"
Margin="5,0,5,0"
BorderBrush="Black"
ItemsSource="{Binding EventLogs}"
SelectionMode="Single"
IsReadOnly="True">
<dg:DataGrid.Columns>
<dg:DataGridTextColumn
Binding="{Binding EventID}" Header="Event ID" />
<dg:DataGridTextColumn
Binding="{Binding Server}" Header="Server" />
<dg:DataGridTextColumn
Binding="{Binding Source}" Header="Source" />
<dg:DataGridTextColumn
Binding="{Binding Logged}" Header="Logged" />
</dg:DataGrid.Columns>
</dg:DataGrid>
C#代码
public class EventLogItem
{
public long EventID { get; set; }
public string Name { get; set; }
public string Message { get; set; }
public Server Server { get; set; }
public string Source { get; set; }
public EventLogEntryType Level { get; set; }
public DateTime Logged { get; set; }
public string Machine { get; set; }
}
public List<EventLogItem> EventLogs
{
get { return (List<EventLogItem>)GetValue(EventLogsProperty); }
set { SetValue(EventLogsProperty, value);
}
这里的真正问题是虽然我在xaml代码中指定了列及其绑定,但是当数据到达时,每个属性都占用了一列。期望的效果是仅显示出限制的绑定属性。
答案 0 :(得分:2)
DataGrid有一个属性AutoGenerateColumns
,默认情况下设置为true,为您提供您不期望的额外列。只需在DataGrid的xaml声明中设置AutoGenerateColumns="False"
,您将只获得指定的列。
(就个人而言,我总是发现这更令人烦恼而不是方便!)
答案 1 :(得分:1)
或者您可以设置DataGrid
的{{1}} = AutoGenerateColumns
,定义一个处理true
事件并使用Behavior<DataGrid>
的简单AutoGeneratingColumn
类} {s} System.ComponentModel
每个列的绑定属性上的属性,用于指定自定义列标题(和/或其他列属性)或抑制列(不具有属性)。在此处查看这个非常简单的解决方案:A Smart Behavior for DataGrid.AutoGenerateColumns。顺便说一句,我还注意到Xceed的DisplayName
自动(无需定义DataGridControl
类)使用Behavior<DataGridControl>
属性(如果有的话)来覆盖列标题。但是,如果属性不存在,它将不会抑制列(并且我没有研究它们是否支持以其他方式自动生成列抑制)。我通过处理视图的DisplayName
事件并将列{'1}}属性设置为Loaded
来对其进行半黑客攻击,Visible
是一个代表它的常量应该被抑制(即“_ “)。