2009-11-12 2 views
10

У меня есть 3 таблицы: Элемент - это DataContext - он имеет столбец навигации Группа Группа - содержит навигационную колонку Категория.Проблема привязки DataGridComboBoxColumn.ItemsSource

Я хочу иметь в столбцах DataGrid (категория &) столбцы, и когда я выбираю категорию, она должна отображать в группе col только категорию. Группы.

Вот код, я работаю над:

<tk:DataGrid AutoGenerateColumns="False" ItemsSource="{Binding}"> 
    <tk:DataGrid.Columns> 

     <!--Works--> 
     <tk:DataGridComboBoxColumn           
      Header="Categroy" 
      DisplayMemberPath="Title"      
      SelectedValuePath="CategoryId" 
      SelectedValueBinding="{Binding Group.Category.CategoryId}" 
      ItemsSource="{Binding Context.Categories, 
       Source={x:Static Application.Current}}" 
     /> 


     <!--Look at these two things:--> 

     <!--This does work--> 
     <tk:DataGridTemplateColumn> 
      <tk:DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <ItemsControl 
         ItemsSource="{Binding Group.Category.Groups}"> 
         <ItemsControl.ItemTemplate> 
          <DataTemplate DataType="{x:Type data:Group}"> 
           <TextBlock Text="{Binding Title}"/> 
          </DataTemplate> 
         </ItemsControl.ItemTemplate> 
        </ItemsControl> 
       </DataTemplate> 
      </tk:DataGridTemplateColumn.CellTemplate> 
     </tk:DataGridTemplateColumn> 

     <!--But this does NOT work, even it's the same source--> 
     <!--Notice I even tried a dummy converter and doesnt reach there--> 
     <tk:DataGridComboBoxColumn 
      Header="Group" 
      DisplayMemberPath="Title" 
      SelectedValuePath="GroupId" 
      ItemsSource="{Binding Group.Category.Groups, 
       Converter={StaticResource DummyConverter}}" 
      SelectedValueBinding="{Binding Group.GroupId}" 
      /> 

    </tk:DataGrid.Columns> 
</tk:DataGrid> 

Update
ли вы сказать, что проблема заключается в том, что свойство ItemsSource не может быть установлен в нестатический Binding? Я подозреваю, потому что даже я установил ItemsSource в {Binding} с DummyConverter, он не останавливается в конвертере; и в ComboBox категории он отлично работает.

ответ

28

Столбцы в datagrid не имеют datacontext, поскольку они никогда не добавляются в визуальное дерево. звук немного странный, но посмотрите на vince's blog, его получился хороший пример визуального макета. когда сетка рисуется клетка имеет контекст данных, и вы можете установить источник комбо коробки пунктов в них с помощью обычных привязок (не статических ресурсов ..)

Вы можете получить доступ к коробке источника пунктов комбы, как, например:

<dg:DataGridComboBoxColumn> 
    <dg:DataGridComboBoxColumn.EditingElementStyle> 
     <Style TargetType="ComboBox"> 
     <Setter Property="ItemsSource" Value="{Binding Path=MyBindingPath}" /> 
     </Style> 
    </dg:DataGridComboBoxColumn.EditingElementStyle> 
</dg:DataGridComboBoxColumn> 

Посмотрите here, а также here для получения некоторого кода. Вы также должны установить источник пунктов для отсутствия edting элемента как в этом post

+0

Как заставить его работать для .NET 4.0 Datagrid? Блог Вьюса, похоже, устарел. – newman

+0

Я не думаю, что реализация Datagrid ComboColumn изменилась в версии .net 4. –

+0

Я использовал тот же подход, но источник данных, похоже, не связывает столбец. Я вижу пустое поле со списком в DataGrid. – Nps

0

Я использую MVVM, и я хотел, чтобы связать ItemSource колонки к коллекции объектов в контексте окна данных. Я, должно быть, пробовал 10 разных способов, и ничего не сработало, пока не нашел this answer.

Хитрость заключается в определении CollectionViewSource вне сетки, а затем ссылаться на нее внутри сетки, используя StaticResource. Например,

<Window.Resources> 
    <CollectionViewSource x:Key="ItemsCVS" Source="{Binding MyItems}" /> 
</Window.Resources> 
<!-- ... --> 
<DataGrid ItemsSource="{Binding MyRecords}"> 
    <DataGridComboBoxColumn Header="Column With Predefined Values" 
          ItemsSource="{Binding Source={StaticResource ItemsCVS}}" 
          SelectedValueBinding="{Binding MyItemId}" 
          SelectedValuePath="Id" 
          DisplayMemberPath="StatusCode" /> 
</DataGrid> 
Смежные вопросы