2012-12-31 58 views
0

我使用WPF工具包中的DataGrid - 最新的一个。但是,下面的代码是不工作WPF 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

什么是[绑定错误](http://www.zagstudio.com/blog/486) – Tilak

+0

绑定是不是被通知添加到集合中的新元素?如果您使用'ObservableCollection '而不是'List ',会发生什么? – ceyko

+0

好吧,我会尝试使用它。这里的问题是,当我设置EventLogs属性时,显示的所有属性而不是我绑定的那4列真的很令人沮丧。 – imgen

回答

2

DataGrid有一个属性AutoGenerateColumns,它默认设置为true,给你额外的列,你不期望。只需在DataGrid的xaml声明中设置AutoGenerateColumns="False",您将只获取指定的列。

(就个人而言,我总是发现超过这个便利的烦恼呢!)

1

或者您可以设置DataGridAutoGenerateColumns = true,定义了一个简单Behavior<DataGrid>类来处理该事件AutoGeneratingColumn和使用System.ComponentModelDisplayName每个列的Bound属性上的属性可以指定自定义列标题(和/或其他列属性)或禁止列(通过不具有属性)。看到这个伟大而简单的解决方案在这里:A Smart Behavior for DataGrid.AutoGenerateColumns。顺便说一句,我也只是注意到Xceed的DataGridControl自动(不必你定义一个Behavior<DataGridControl>类)使用DisplayName属性(如果有)来覆盖列标题。然而,如果属性不存在,那么它不会抑制列(我还没有研究过它们是否支持以其他方式自动生成列抑制)。我通过处理视图的Loaded事件并将列'Visible属性设置为false其中的Title是一些表示它应该被抑制的常数(即“_”)来半黑客入侵。