Ответ 1
Проблема заключается в том, что Columns не наследует DataContext.
Подробнее здесь Связывание в текстовом столбце таблицы данных WPF
По общему признанию, я новичок в WPF, но я посмотрел и посмотрел и не могу найти решение этой проблемы.
У меня есть простой объект вроде:
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: 2: Не удается найти управляющий элемент FrameworkElement или FrameworkContentElement для целевого элемента. BindingExpression: Path = меры; DataItem = NULL; целевой элемент - "DataGridComboBoxColumn" (HashCode = 11497055); target является "ItemsSource" (тип "IEnumerable" )
Как это исправить?
Спасибо
Проблема заключается в том, что Columns не наследует DataContext.
Подробнее здесь Связывание в текстовом столбце таблицы данных WPF
Это наилучшее решение:
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}}"
Если ваши меры являются общими для всех объектов, вы можете сделать статические шаги
public String[] Measures { get; }
И ваш xaml будет использовать его, как показано ниже:
<DataGridComboBoxColumn
Header="Role"
SelectedValueBinding="{Binding Role}"
ItemsSource="{Binding Source={x:Static local:ProjectsDataContext.Roles}}"
DisplayMemberPath="Name"/>
Надеюсь, это поможет.