2015-07-09 4 views
1

Я пытаюсь реализовать новый элемент управления (XGrid), который содержит DataGrid.Как определить столбцы для внутреннего DataGrid в настраиваемом элементе управления

В большинстве случаев я напрямую привязываю данные через DependencyProperty и устанавливаю AutoGenerateColumns в True.

Теперь, в конкретном случае, мне нужно настроить столбцы DataGrid вручную. Я думал о чем-то вроде:

<local:XGrid AutoGenerateColumns="False" DataContext="{Binding SourceList}"> 
    <local:XGrid.Columns> 
     <DataGridTextColumn Header="T1" Binding="{Binding Path=.Value1}"/> 
     <DataGridTextColumn Header="T2" Binding="{Binding Path=.Value2}"/> 
     <DataGridTextColumn Header="T3" Binding="{Binding Path=.Value3}"/> 
    </local:XGrid.Columns>   
</local:XGrid> 

ли это, или что-то подобное, возможно?

--- EDIT 1 ---

Xgrid на самом деле не является производным от DataGrid

ответ

1

Изменено мой последний ответ, как ваша правка изменил сценарий ....

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

что-то, как это должно работать ..

public static readonly DependencyProperty GridColumnsProperty = DependencyProperty.Register("GridColumns", typeof(ObservableCollection<DataGridColumn>), typeof(XGrid)); 
     public ObservableCollection<DataGridColumn> GridColumns 
     { 
      get { return (ObservableCollection<DataGridColumn>)GetValue(GridColumnsProperty); } 
      set { SetValue(GridColumnsProperty, value); } 
     } 


public XGrid() 
{ 
     GridColumns = new ObservableCollection<DataGridColumn>(); 
     GridColumns.CollectionChanged += (x, y) => 
      { 
       dataGrid.Columns.Clear(); 
       foreach (var column in this.GridColumns) 
       { 
        dataGrid.Columns.Add(column); 
       } 
      }; 
     InitializeComponent(); 
    } 
+0

Да, это работает, но теперь я получаю 'ArgumentException', когда я открываю мой модуль, содержащий Xgrid второй раз, сказав следующее: ' Дополнительная информация: DataGridColumn с заголовком T1 уже существует в коллекции столбцов DataGrid. Сетки данных не могут совместно использовать столбцы и не могут содержать повторяющиеся экземпляры столбцов. ' – Xenogenesis

+0

У вас есть этот' dataGrid.Columns.Clear(); 'in place? – Muds

+0

Да, я проследил экземпляр XGrid, зарегистрировав UID, указанный в конструкторе, когда я закрою свой модуль и снова открою его (Open означает создание нового экземпляра для каждого нового модуля(); ... Тот же экземпляр XGrid используется! Его не утилизируют или что-то в этом роде? Кажется, он используется повторно? – Xenogenesis