Как связать коллекцию с WPF: DataGridComboBoxColumn - PullRequest
19 голосов
/ 23 мая 2010

По общему признанию, я новичок в 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»)

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

Спасибо

Ответы [ 3 ]

10 голосов
/ 05 февраля 2016

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

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}}"
3 голосов
/ 24 мая 2010
2 голосов
/ 29 ноября 2015

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

public String[] Measures { get; }

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

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

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

...