Проблема пользовательского интерфейса при динамическом связывании списка объектов с DataGrid - PullRequest
1 голос
/ 30 января 2012
class ContainingObject
{
    private ContainedObject objContained;

    public int ContainingObjectID { get; set; }
    public ContainedObject Obj { get { return objContained; } }

    // Methods that initalize contained objects and such <here>
}

class ContainedObject
{
    public int ID { get; set; }
    public int Height { get; set; }
    public int Width { get; set; }
}

// Binding Code
List<ContainingObject> lstContainingObjects = new List<ContainingObject>();
// Code to Populate List <here>
dtgrdTheDataGrid.ItemsSource = lstContainingObjects;

Когда список привязан к сетке данных, он показывает только следующие столбцы; ContainingObjectID и Obj.

  1. Как мне, не изменяя (edit: XAML) и создавая свойства для каждого члена в пределах ContainedObject в самом ContainingObject, получить сетку данных для отображения следующих столбцов; ContainingObjectID, Obj, ID, Height, Width?

  2. Что я могу сделать, чтобы столбец Obj (возвращает ContainedObject) действительно отображал что-то в ячейке каждой строки?

1 Ответ

0 голосов
/ 30 января 2012

Поведение DataGrid по умолчанию - AutoGenerateColumns, что означает, что он будет смотреть на ваши объекты и создавать столбец для каждого открытого свойства объекта.

Чтобы изменить это поведение, вы можете установить AutoGenerateColumns="False" и вручную добавьте свои собственные столбцы в DataGrid.Это то, что я рекомендую.

<DataGrid x:Name="dtgrdTheDataGrid" AutoGenerateColumns="False">
    <DataGrid.Columns>        
        <DataGridTextColumn Header="ContainingObjectId" Binding="{Binding ContainingObjectID }" />      
        <DataGridTemplateColumn Header="ContainedObject">
            <DataTemplate>
                <TextBlock Text="Whatever you want here" />
            </DataTemplate>
        </DataGridTemplateColumn>
        <DataGridTextColumn Header="ContainedObjectId" Binding="{Binding ContainedObject.Id}" />  
        <DataGridTextColumn Header="Height" Binding="{Binding ContainedObject.Height}" />
        <DataGridTextColumn Header="Width" Binding="{Binding ContainedObject.Width}" />
    </DataGrid.Columns>
</DataGrid>

Если вы не хотите создавать свои собственные столбцы, вы можете расширить свой класс ContainingObject, включив в него общедоступные свойства для свойств ContainedObject.Чтобы отобразить что-то еще в столбце Obj, перезапишите метод .ToString() для ContainedObject, поскольку WPF по умолчанию напишет метод .ToString() любого класса, который он не знает, как рисовать в пользовательском интерфейсе.

class ContainingObject
{
    private ContainedObject objContained;

    public int ContainingObjectID { get; set; }
    public ContainedObject Obj { get { return objContained; } }

    // Of course, you should include a check for if objContained is null
    public int ContainedObjectId { get { return objContained.Id; } }
    public int ContainedObjectHeight { get { return objContained.Height; } }
    public int ContainedObjectWidth { get { return objContained.Width; } }

}

class ContainedObject
{
    public int ID { get; set; }
    public int Height { get; set; }
    public int Width { get; set; }

    public override ToString()
    {
        // Return whatever you want here
        return string.format("Contained object: {0}", ID);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...