我试图在DataGrid中使用ComboBox,这将允许用户选择来自不同表的值。我使用ViewModel类作为DataContext,它包含一个ObservableCollection用于Terminals,另一个用于TerminalTypes。
网格上的绑定很好,所有行都已填充,DataGridTextColumns都显示正确的数据,但我的ComboBox是空的。
我知道尝试绑定的ObservableCollection已经填充了,如果我将ComboBox移到DataGrid之外,它会按预期工作。
<my:DataGrid Name="MenuDetailGrid" AutoGenerateColumns="False" ItemsSource="{Binding Terminals}">
<my:DataGrid.Columns>
<my:DataGridTextColumn Header="Terminal Type ID" Binding="{Binding TERMINAL_TYPE_ID}" IsReadOnly="True" />
<my:DataGridTemplateColumn Header="Terminal Type">
<my:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox DisplayMemberPath="TTYPE_NAME" SelectedValuePath="TERMINAL_TYPE"
SelectedValue="{Binding TERMINAL_TYPE_ID}"
ItemsSource="{Binding TerminalTypes}" />
</DataTemplate>
</my:DataGridTemplateColumn.CellTemplate>
</my:DataGridTemplateColumn>
显然,当部分DataGrid时,ComboBox上的绑定行为是不同的,但我有点难过为什么?
有人可以帮我理解我做错了吗?
答案 0 :(得分:4)
绑定行为是相同的。然而,DataConmplate中的DataConmplate由ItemsControl设置为当前项,在您的情况下,这是Terminals
- 集合的成员。因此,找不到TerminalTypes集合(除非您在项目上也实现它)。
您可以做的是在Binding中使用相对来源。这样,您可以导航到DataGrid的DataContext,然后访问您的TerminalTypes
- 集合:
<ComboBox DisplayMemberPath="TTYPE_NAME"
SelectedValuePath="TERMINAL_TYPE"
SelectedValue="{Binding TERMINAL_TYPE_ID}"
ItemsSource="{Binding DataContext.TerminalTypes,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=DataGrid}" />
希望这有帮助。如果没有,请发表评论。
答案 1 :(得分:1)
你应该看看Aran Mulholland的this answer。
它有一个使用DataGridComboBoxColumn
的好样本为您的XAML改编this article
<my:DataGridComboBoxColumn SelectedValueBinding="{Binding TERMINAL_TYPE_ID}"
SelectedValuePath="TERMINAL_TYPE_ID"
DisplayMemberPath="TERMINAL_TYPE"
Header="Terminal Type"
ItemsSource="{Binding TerminalTypes}" />
</my:DataGridComboBoxColumn>
答案 2 :(得分:0)
这是我在我的小测试项目中最终得到的结果,我会在适当的代码中使用它。
<Grid>
<Controls:DataGrid Name="MenuDetailGrid" AutoGenerateColumns="False" ItemsSource="{Binding Terminals}">
<Controls:DataGrid.Columns>
<Controls:DataGridTemplateColumn Header="SomeHeader">
<Controls:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding TTYPE_NAME}" />
</DataTemplate>
</Controls:DataGridTemplateColumn.CellTemplate>
<Controls:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox DisplayMemberPath="TTYPE_NAME"
SelectedValuePath="TERMINAL_TYPE_ID"
SelectedValue="{Binding TERMINAL_TYPE_ID}"
ItemsSource="{Binding DataContext.TerminalTypes,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Controls:DataGrid}}" />
</DataTemplate>
</Controls:DataGridTemplateColumn.CellEditingTemplate>
</Controls:DataGridTemplateColumn>
</Controls:DataGrid.Columns>
</Controls:DataGrid>
</Grid>