代码之家  ›  专栏  ›  技术社区  ›  user1647334

绑定到ObservableCollection<Object>时显示空行的DataGrid

  •  1
  • user1647334  · 技术社区  · 12 年前

    我有一个简单的DataGrid,我将它绑定到一个ObservableCollection,它在网格中产生黑色的细线,没有可见的数据。我使用ObservableCollection,因为我使用反射在运行时中构建了这个集合。

    我正在做这样的事情 XAML公司

       <DataGrid ItemsSource="{Binding Data}" />
    

    C#

    public ObservableCollection<object> Data
    { 
            get { return _Data; }
            set { 
                this._deals = value;
                this.NotifyPropertyChanged("Deals");
                }
     }
     public Run()
     {
            this.Data = CreateData(typeof(MyRecordClass))   //'MyRecordClass' needs to be passed at runtime
      }
    
    
    public ObservableCollection<Object> CreateData(Type RecordType)
    {
       ObservableCollection<Object> data = new ObservableCollection<object>();  
       var record = Activator.CreateInstance(RecordType);
        // Logic to load the record with Data 
       data.Add(record);
       return data;
    }
    

    有没有一种方法可以让DataGrid在不指定ColumnNames的情况下读取ObservableCollection,或者在CreateData函数中创建ObservableCollectionobject?

    1 回复  |  直到 12 年前
        1
  •  1
  •   Vitaliy Nesterenko    12 年前

    您的集合应该具有公共属性 ,所以datagrid可以将列绑定到它。 如果使用Object的集合类型,则没有用于绑定的属性,因此将显示空行。

    以下是您的示例:

    公共分部类MainWindow:窗口 { 公共ObservableCollection数据源;

        public MainWindow()
        {
            InitializeComponent();
    
            this.dataSource = new ObservableCollection<SomeDataSource>();
    
            this.dataSource.Add(new SomeDataSource { Field = "123" });
            this.dataSource.Add(new SomeDataSource { Field = "1234" });
            this.dataSource.Add(new SomeDataSource { Field = "12345" });
    
            this.dataGrid1.ItemsSource = this.dataSource;
        }
    }
    
    public class SomeDataSource
    {
        public string Field {get;set;}
    }
    
    
    
     <DataGrid AutoGenerateColumns="False" Height="253" HorizontalAlignment="Left" Margin="27,24,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="448">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="First" Binding="{Binding Path=Field, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                </DataGrid.Columns>
     </DataGrid>