2010-05-22 10 views
14

Понятно, что я новичок в WPF, но я посмотрел и посмотрел и не могу найти решение этой проблемы.Как связать сборку с WPF: DataGridComboBoxColumn

У меня есть простой объект, например:

class Item 
{ 
    .... 

    public String Measure { get; set; } 
    public String[] Measures {get; } 
} 

Что я пытаюсь привязать к DataGrid с двумя текстовыми столбцами и столбца со списком. Для столбца со списком свойство Measure - это текущий выбор и измеряет возможные значения.

Мой XAML является:

<DataGrid Name="recipeGrid" AutoGenerateColumns="False" 
      CellEditEnding="recipeGrid_CellEditEnding" CanUserAddRows="False" 
      CanUserDeleteRows="False"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Food" Width="Auto" 
          Binding="{Binding Food.Name}" /> 
     <DataGridTextColumn Header="Quantity" IsReadOnly="False" 
          Binding="{Binding Quantity}" /> 

     <DataGridComboBoxColumn Header="Measure" Width="Auto" 
           SelectedItemBinding="{Binding Path=Measure}" 
           ItemsSource="{Binding Path=Measures}" /> 

    </DataGrid.Columns> 
</DataGrid> 

Текст колонке отображаются только штраф, но выпадающий нет - значения не отображаются вообще. Ошибка связывания:

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Measures; DataItem=null; target element is 'DataGridComboBoxColumn' (HashCode=11497055); target property is 'ItemsSource' (type 'IEnumerable')

Как исправить это?

Благодаря

ответ

2

Проблема заключается в том, что столбцы не делает наследует DataContext.

Подробнее здесь Binding in a WPF data grid text column

здесь blogs.msdn.com/vinsibal/archive/2008/12/17/wpf-datagrid-dynamically-updating-datagridcomboboxcolumn.aspx

и здесь http://blogs.msdn.com/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx

+1

Ну, если это правда, то почему текстовые колонки работают, но столбец со списком Безразлично «т ?? – georgiosd

+0

Если я правильно понимаю, это потому, что текстовые столбцы связаны непосредственно на свойство ItemsSource в DataGrid, в DataGrid.ItemsSource-> item-> Мера и ComboBox неявно связаны с DataContext из пункта, который не наследуется. DataGrid.ItemsSource-> Item-> DataContext-> Measures/Measure Вот как я это понял, по общему признанию, теперь вижу, что я не очень хорошо объясняю это. Возможно, кто-то может сделать это лучше меня. – ThomasAndersson

+1

> Обратите внимание, что причина, по которой Binding работает, заключается в том, что внутренний код динамически устанавливает привязку DataGridColumn.Binding к DataGridCell.Content (http://blogs.msdn.com/b/vinsibal/archive/2009/04/07/) 5-random-gotchas-with-the-wpf-datagrid.aspx) – Maxence

2

Если ваши меры являются общими для всех объектов, то вы можете сделать меры статические

public String[] Measures { get; } 

И ваш XAML будет использовать его, как показано ниже:

<DataGridComboBoxColumn 
    Header="Role" 
    SelectedValueBinding="{Binding Role}" 
    ItemsSource="{Binding Source={x:Static local:ProjectsDataContext.Roles}}" 
    DisplayMemberPath="Name"/> 

Надеюсь, это поможет.

5

Это руки вниз лучшее решение:

http://wpfthoughts.blogspot.com/2015/04/cannot-find-governing-frameworkelement.html

Идея заключается в том, что вы объявляете CollectionViewSource как статический ресурс и затем декларативно связать его с ItemsSource из DataGridComboBoxColumn.

Создать и связать статический CollectionViewSource:

<Page.Resources> 
    <CollectionViewSource x:Key="Owners" Source="{Binding Owners}"/> 
</Page.Resources> 

А затем связать свою целевую ItemsSource:

ItemsSource="{Binding Source={StaticResource Owners}}" 
+2

Простой и эффективный! Вы также можете поместить 'CollectionViewSource' непосредственно в' ', если он не используется в другом месте. – piedar

Смежные вопросы