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}}"