Указание и отображение столбцов DataGrid в WPF декларативно с помощью привязки? - PullRequest
3 голосов
/ 08 декабря 2009

Есть ли способ указать столбцы DataGrid декларативно с помощью привязки? (И установить свойства столбцов, используя эту привязку?) В идеале, у меня был бы список объектов (например, строк), привязанных к ItemsSource, и одним из их свойств был бы словарь (или список объектов определенного класса или чего-либо еще) с именем и значением. Я хотел бы, чтобы DataGrid автоматически создавал эти дополнительные столбцы без какого-либо кода позади. Это вообще возможно? Или как бы вы обойти это?

Массив, содержащий дополнительные значения, может изменяться со временем, но он будет одинаковым для всех элементов в списке.

Можно было бы (и очистить) предоставить DataGrid другой список только для того, чтобы он мог создавать столбцы. Но для этого мне нужно что-то вроде ColumnsSource или что-то ...

Единственное, что я мог придумать, это создать подкласс DataGrid ...

Есть идеи?

EDIT: Суть в достижении этого без какого-либо кода позади ...

Ответы [ 3 ]

1 голос
/ 08 декабря 2009

В Рискуя спорно ...

Я думаю, что это один из примеров, когда View действительно нужно немного «увеличить» код, и рекомендация «без кода позади» может быть отложена в сторону - если вы помните, что ваши проблемы должны быть разделены .

В прошлом я динамически создавал элементы управления DataGrid, собирая соответствующие данные из ViewModel и записывая метод BuildDataGrid, аналогичный ответу Partial, в выделенном коде. Я полагаю, что это оправдано, потому что код был просто связан с дополнением View, и я не смешивал опасения, заставляя его реализовывать бизнес-правила - он просто собирал столбцы и создавал привязки столбцов, в зависимости от ситуации.

Но если важнее поддерживать чистоту кода позади, то я бы порекомендовал вам оригинальную мысль о создании пользовательского элемента управления и использовании DP для «подкласса» элемента управления.

1 голос
/ 08 декабря 2009

В вашем XAML свяжите свою сетку данных с ObservableCollection объектов определенного класса, который имеет свойства.

XAML:

<WpfToolkit:DataGrid
        x:Name="MyDataGrid"
        ItemsSource="{Binding Path=Collection}"
        HorizontalScrollBarVisibility="Hidden" SelectionMode="Extended"
        CanUserAddRows="False" CanUserDeleteRows="False"
        CanUserResizeRows="False" CanUserSortColumns="False"
        AutoGenerateColumns="False"
        RowHeaderWidth="25" RowHeight="25"/>

Затем вы можете программно создавать свои столбцы в C # / VBA и привязывать каждый отдельный столбец к свойству класса, в котором ObservableCollection содержит его объекты. Добавляя объекты класса, вы будете добавлять строки в сетку данных. Другими словами, каждый объект класса в ObservableCollection будет строкой, а свойства класса будут столбцами.

Вот пример того, как вы можете связать свои столбцы программно ... C #:

ObservableCollection<IData> datagridData = new ObservableCollection< IData >();
Binding items = new Binding();
PropertyPath path = new PropertyPath("Name"); // 'Name' is actually the name of the variable representing the property
items.Path = path;

MyDataGrid.Columns.Add(new DataGridTextColumn()
{
   Header = "Names",
   Width =  275,
   Binding = items
});
//repeat the creation of columns
//...
//- Add some objects to the ObservableCollection
//- Then bind the ItemsSource of the datagrid to the ObservableCollection
datagridData .Add(new Data("Bob", string.Empty));
MyDataGrid.DataContext = new DataModel{ MyData = datagridData };

* Edit: Извини за это! Вот как вы можете достичь того же самого в XAML:

<WpfToolkit:DataGrid
        x:Name="MyDataGrid"
        ItemsSource="{Binding Path=Collection}"
        HorizontalScrollBarVisibility="Hidden" SelectionMode="Extended"
        CanUserAddRows="False" CanUserDeleteRows="False"
        CanUserResizeRows="False" CanUserSortColumns="False"
        AutoGenerateColumns="False"
        RowHeaderWidth="25" RowHeight="25">

             <WpfToolkit:DataGridTextColumn
                        Header="Names" Width="2*"
                        Binding="{Binding Path=Name}"/>
             <WpfToolkit:DataGridTextColumn
                        Header="Names" Width="2*"
                        Binding="{Binding Path=Age}"/>

        </WpfToolkit:DataGrid.Columns>
</WpfToolkit:DataGrid>

Редактировать 2: Вот как может выглядеть код ObservableCollection и класса в C #:

public class DataModel
    {
        public ObservableCollection<IData> MyData{ get; set; }
    }

public interface IData
    {
        string Name{ get; set; }
        string Age{ get; set; }
    }

public class Data : IData
    {
        public Data(string name, string age)
        {
            Name= name;
            Age= age;
        }

        public string Name{ get; set; }
        public string Age{ get; set; }
    }
0 голосов
/ 08 декабря 2009

Я думаю, что вам придется разделить сетку на подклассы. Столбцы не являются обязательным свойством. если вы не можете привязать к нему, вы не можете динамически возиться с ним в xaml.

Что касается использования элементов для создания столбцов, значит ли это, что если бы в сетке не было элементов, не было бы столбцов?

Если у вас есть подкласс сетки, в которой есть свойство столбцов, к которому можно привязаться, то место для динамического изменения столбцов будет в вашей модели представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...