C# 如何将集合绑定到WPF:DataGridComboxColumn

C# 如何将集合绑定到WPF:DataGridComboxColumn,c#,wpf,datagrid,C#,Wpf,Datagrid,我有一个简单的对象,如: class Item { .... public String Measure { get; set; } public String[] Measures {get; } } 我正试图将其绑定到一个包含两个文本列和一个组合框列的DataGrid。 对于组合框列,属性度量是当前选择并度量可能的值 我的XAML是: <DataGrid Name="recipeGrid" AutoGenerateColumns="False" C

我有一个简单的对象,如:

class Item
{
  ....

  public String Measure { get; set; }
  public String[] Measures {get; }
}
我正试图将其绑定到一个包含两个文本列和一个组合框列的DataGrid。 对于组合框列,属性度量是当前选择并度量可能的值

我的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=Measures;DataItem=null;目标元素是“DataGridComboxColumn”(HashCode=11497055);目标属性为“ItemsSource”(类型为“IEnumerable”)


如何解决此问题?

问题在于列不继承DataContext

在这里看到更多

这里


这里

如果度量对于所有对象都是公共的,那么可以将度量设置为静态的

public String[] Measures { get; }
您的xaml将使用它,如下所示:

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


希望这会有所帮助。

这是最好的解决方案:

这里的想法是将一个CollectionViewSource声明为一个静态资源,然后声明性地将其绑定到DataGridComboBoxColumn的ItemsSource

创建并绑定静态CollectionViewSource:

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

如果这是真的,那么为什么文本列可以工作,而组合框列不能工作呢?如果我理解正确,那是因为文本列直接绑定到DataGrid的ItemsSource、DataGrid.ItemsSource->Item->Measure中的属性,而组合框隐式绑定到该项的DataContext,而不是继承的。ItemsSource->Item->DataContext->Measures/Measures这就是我对它的理解,无可否认,我现在不太擅长解释它。可能有人比我做得更好。>请注意,绑定之所以有效,是因为内部代码动态地将DataGridColumn.Binding绑定到DataGridCell.Content()简单有效!如果未在其他地方使用,您也可以将
CollectionViewSource
直接放在
中。我知道这是一篇老文章,但当ObservableCollection位于ViewModel而不是视图中时,这是如何工作的?
ItemsSource="{Binding Source={StaticResource Owners}}"