WPF DataGrid ItemsSource Issue

Logan B. Lehman picture Logan B. Lehman · Apr 27, 2013 · Viewed 14.5k times · Source

Please let it be known that I am relatively new to WPF. I am creating a new ObservableCollection with the type of my simple data class, and assigning that to the ItemsSource property of my DataGrid. Before I go into my problem here is the code:

XAML:

<my:DataGrid SelectionMode="Single" SelectionUnit="Cell" Height="113" HorizontalAlignment="Left" Margin="11,22,0,0" Name="addressGrid" VerticalAlignment="Top" Width="213" Background="#FFE2E2E2" AlternatingRowBackground="#FFA4CFF2" BorderBrush="#FF7C7C7C" HorizontalGridLinesBrush="White" PreviewKeyDown="addressGrid_PreviewKeyDown" CellEditEnding="addressGrid_CellEditEnding" BeginningEdit="addressGrid_BeginningEdit" PreparingCellForEdit="addressGrid_PreparingCellForEdit">
        <my:DataGrid.Columns>
        <my:DataGridTextColumn Header="Name" Width="*" Binding="{Binding Path=Name}"></my:DataGridTextColumn>
        <my:DataGridTextColumn Header="Value" Width="3*" Binding="{Binding Path=Value}"></my:DataGridTextColumn>
        <my:DataGridTextColumn Header="Index" Visibility="Hidden" Binding="{Binding Path=Index}"></my:DataGridTextColumn>
        </my:DataGrid.Columns>
</my:DataGrid>

Data Class:

public class PropertyFields
{
    public string Name { get; set; }
    public object Value { get; set; }
    public int Index { get; set; }
}

Population:

ObservableCollection<PropertyFields> propertyList = new ObservableCollection<PropertyFields>();
for (int i = 0; i < m_pFields.FieldCount - 1; ++i)
{
   propertyList.Add(new PropertyFields() {Name = m_pFields.Field[i].AliasName, Value = DisplayedValueForRow(i), Index = i});
}

// Set ItemSource to populate grid
addressGrid.ItemsSource = propertyList;

More information about the population method:

I am building this solution with ArcGIS framework, so some things are not "System" in ways.

  • m_pFields is an IFields interface object that allows me to store spatial layer information

  • IFields has a FieldCount property which returns a number of fields in the collection

  • DisplayedValueForRow(i) calls another ArcGIS obj method IPropertySet.GetProperty() and returns the value.


The Problem:

Everything is being populated as it should be, but for some odd reason it is re-creating the three columns (Name, Value, Index) again ON TOP of populating the ones created in XAML -- In turn ending up with 2 sets of the same data. I found this to be weird behavior, as I swear I have seen people bind to their grid this way before.

What am I doing wrong?

Edit

Thanks to ChrisO's comment, I found out that there is a property called "AutoGenerateColumns" that needed to be turned off. Well I feel like a heel. Thanks!

Answer

ChrisO picture ChrisO · Apr 27, 2013

Just set the AutoGenerateColumns property to false on your DataGrid. Then it will only use the columns you specified.