Как реализовать многоколонный ComboBox DataGridColumn в WPF DataGrid? - PullRequest
3 голосов
/ 24 августа 2011

У меня есть простой вопрос, который, я полагаю, не имеет простого решения.Мне нужно иметь многоколоночный ComboBox для некоторых столбцов сетки в моей WPF DataGrid.Есть ли известная лучшая практика для достижения этой цели?Из того, что я понял, для этого потребуется создать подкласс DataGridComboBoxColumn для поддержки собственного ComboBox.

Я нашел несколько примеров этого, но не поддерживаю сущности EF (я использую Code First EF).

Любые советы высоко ценится.Спасибо

ПРИМЕЧАНИЕ: все это делается динамически с C #.Я не использую XAML для определения столбцов.

Обновление : Под многоколонным я подразумеваю просто то, что когда вы опускаете ComboBox вниз, мне нужно показать два значения для «Отображения», дажехотя за кулисами, конечно, я все еще просто храню удостоверение личности.

Смотрите здесь :.multicolumn-dropdown http://www.telerik.com/ClientsFiles/188010_multicolumn-dropdown.JPG

За исключением того, что мне нужно сделать это как DataGridColumn, который можно динамически создавать и добавлять в сетку, а не просто как комбинированный элемент, показанный на изображении.

Обновление Мне наконец-то удалось найти статью о CodeProject, в которой автор разработал элемент управления с моими -точными требованиями.Он расположен здесь .Теперь единственная проблема, которую я пытаюсь решить, - как позволить элементу управления работать при использовании Entity Framework (в частности, сначала кода).Все ближе!

Ответы [ 3 ]

3 голосов
/ 24 августа 2011

Я нашел решение для моего конкретного сценария.Я загрузил пользовательский многоколоночный ComboBox с включенным подклассом DataGridComboBoxColumn по ссылке в моем последнем обновлении выше.По сути, я только что сделал эту работу с POCO Entity Framework Code-First, и это решило мою проблему.Вот что я должен был сделать, чтобы он работал с POCO.

Внутри CustDataGridComboBoxColumn есть несколько переопределений.Вам просто нужно немного изменить следующие два переопределения.Я использую отражение, чтобы изменить набор свойств, так как я не знаю, что это будет из элемента управления.

Исходная реализация достигла этого, получив правильную строку из DataRowView с SelectedValuePath.

protected override object PrepareCellForEdit(FrameworkElement editingElement, RoutedEventArgs editingEventArgs)
{
      DataGridCell cell = editingEventArgs.Source as DataGridCell;
      if (cell != null)
      {
        // Changed to support EF POCOs
        PropertyInfo info = editingElement.DataContext.GetType().GetProperty("YourPropertyName", BindingFlags.Public | BindingFlags.Instance);
        object obj = info.GetValue(editingElement.DataContext, null);
        comboBox.SelectedValue = obj;
      }
      return comboBox.SelectedItem;
}

protected override bool CommitCellEdit(FrameworkElement editingElement)
{
    // Dynamically set the item on our POCO (the DataContext).
    PropertyInfo info = editingElement.DataContext.GetType().GetProperty(“YourPropertyName”, BindingFlags.Public | BindingFlags.Instance);
    info.SetValue(editingElement.DataContext, comboBox.SelectedValue, null);
    return true;
}

Кроме того, если вы собираетесь полностью создать этот пользовательский элемент управления в коде, а не в XAML,вам нужно будет добавить установщик в свойство Columns, потому что по умолчанию оно установлено только для чтения.

//The property is default and Content property for CustComboBox
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ObservableCollection<DataGridTextColumn> Columns
{
    get
    {
       if (this.columns == null)
       {
           this.columns = new ObservableCollection<DataGridTextColumn>();
       }
       return this.columns;
    }
    set
    {
       this.columns = value;
    }
}

Спасибо за предоставленные представления и ответы.Извините, я не смог адекватно сформулировать вопрос, чтобы придать ему больше смысла.

0 голосов
/ 16 ноября 2013

что будет означать "YourPropertyName" в: PropertyInfo info = editElement.DataContext.GetType (). GetProperty ("YourPropertyName", BindingFlags.Public | BindingFlags.Instance);

0 голосов
/ 24 августа 2011

Можете ли вы уточнить, что вы подразумеваете под множественным?

Вы ищете что-нибудь подобное ниже?

[Column] (Combo) (Combo) (Combo) [Column]

or

[Column] 
(Combo) 
(Combo) 
(Combo) 
[Column]

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

http://windowsclient.net/wpf/wpf35/wpf-35sp1-toolkit-datagrid-feature-walkthrough.aspx

Вы можете настроить это в XAML, а затем просто предоставить коллекцию в сетку для привязки, которая будет отображать столбцы по мере необходимости.

...