由自动生成的列覆盖的WPF DataGrid列绑定

时间:2012-12-31 03:41:23

标签: wpf wpfdatagrid

我正在使用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代码中指定了列及其绑定,但是当数据到达时,每个属性都占用了一列。期望的效果是仅显示出限制的绑定属性。

2 个答案:

答案 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是一个代表它的常量应该被抑制(即“_ “)。