如何将集合绑定到WPF:DataGridComboBoxColumn

时间:2010-05-22 23:32:09

标签: c# wpf wpfdatagrid

不可否认我是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:路径=措施;的DataItem = NULL; target元素是'DataGridComboBoxColumn'(HashCode = 11497055); target属性是'ItemsSource'(类型'IEnumerable')

我该如何解决这个问题?

由于

3 个答案:

答案 0 :(得分:9)

这是最好的解决方案:

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

这里的想法是,您将 CollectionViewSource 声明为静态资源,然后以声明方式将其绑定到 DataGridComboBoxColumn 的ItemsSource。

创建并绑定静态CollectionViewSource:

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

然后绑定目标ItemsSource:

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

答案 1 :(得分:3)

答案 2 :(得分:2)

如果您的度量对所有对象都是通用的,那么您可以将度量设置为静态

public String[] Measures { get; }

您的xaml将使用它,如下所示:

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

希望它会有所帮助。