0

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

4

2 回答 2

2

DataGrid 有一个属性AutoGenerateColumns,默认情况下设置为 true,从而为您提供您不期望的额外列。只需AutoGenerateColumns="False"在 DataGrid 的 xaml 声明中设置,您将只获得指定的列。

(就个人而言,我总是觉得这比方便更令人烦恼!)

于 2012-12-31T04:06:10.927 回答
1

或者您可以设置DataGrid's AutoGenerateColumns= ,定义一个处理事件true的简单Behavior<DataGrid>类,并在每个列的 Bound 属性上使用'属性来指定自定义列标题(和/或其他列属性)或抑制列(通过没有属性)。在此处查看这个伟大而简单的解决方案:DataGrid.AutoGenerateColumns 的智能行为。顺便说一句,我也刚刚注意到 Xceed自动(无需定义类)使用AutoGeneratingColumnSystem.ComponentModelDisplayNameDataGridControlBehavior<DataGridControl>DisplayName覆盖列标题的属性(如果有)。但是,如果属性不存在,它不会抑制列(我还没有研究它们是否支持以其他方式自动生成的列抑制)。Loaded我通过处理视图的事件并将列的Visible属性设置为false它的Title一些常量来表示它应该被抑制(即“_”)来半破解它。

于 2017-04-14T18:34:54.973 回答