如何将集合绑定到WPF:DataGridComboBoxColumn

u5i3ibmn  于 2023-10-22  发布在  其他
关注(0)|答案(4)|浏览(127)

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

class Item
{
  ....

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

我正试图将其绑定到具有两个文本列和一个组合框列的DataGrid。对于组合框列,属性Measure是当前选择,Measures是可能的值。
我的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>

文本列显示得很好,但组合框却没有-根本不显示值。绑定错误是:
系统.Windows.数据错误:2:找不到目标元素的控制FrameworkElement或FrameworkContentElement。String:String = String; String =null;目标元素为“DataGridComboBoxColumn”(HashCode=11497055);目标属性为“ItemsSource”(类型为“IEnumerable”)
我该如何解决此问题?

zd287kbt

zd287kbt1#

这是最好的解决方案:
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}}"
vom3gejh

vom3gejh3#

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

public String[] Measures { get; }

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

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

希望能帮上忙。

bwntbbo3

bwntbbo34#

如果您希望将行的数据上下文项绑定到组合框,则可以在其模板中使用ComboBoxDataGridTemplateColumn。请注意,您必须将Mode=TwoWay, UpdateSourceTrigger=PropertyChanged属性添加到SelectedItem绑定中,否则它将无法正确更新。

<DataGridTemplateColumn Header="My Stuff">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ComboBox ItemsSource="{Binding MyThings}"
                SelectedItem="{Binding SelectedThing, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

相关问题