我可以使用以下xmal:
将Combobox添加到DataGrid <local:DataGridTemplateColumn Header="SomeHeader" Width="106" HeaderStyle="{StaticResource headerAlignRightStyle}" CellStyle="{StaticResource cellAlignRightStyle}">
<local:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding SomeProp}" Margin="4"/>
</DataTemplate>
</local:DataGridTemplateColumn.CellTemplate>
<local:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox
x:Name="SomeCombo"
SelectionChanged="SomeCombo_SelectionChanged"
ItemsSource="{Binding SomeList}"
DisplayMemberPath="Name"
/>
</DataTemplate>
</local:DataGridTemplateColumn.CellEditingTemplate>
</local:DataGridTemplateColumn>
然而,我无法弄清楚是获得combox行的明智方法 势必。即在处理组合框SelectionChanged事件时,我无法知道什么 组合框属于哪一排。特别是我不知道DataGrid数据源中的对象是什么 组合框所指的是。
非常感谢任何帮助。
答案 0 :(得分:2)
你可以
A)使用双向绑定将ComboBox的SelectedItem属性绑定到ViewModel / data模型中的属性,因此您不必首先担心SelectionChanged
或
B)在SelectionChanged处理程序中使用DataGridRow.GetRowContainingElement(element),即
private void SomeCombo_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var comboBox = sender as ComboBox;
if (comboBox == null)
return;
var row = DataGridRow.GetRowContainingElement(comboBox);
// Do something with row...
}
干杯,亚历克斯
答案 1 :(得分:1)
如果您只想获取行所绑定的项目,您只需阅读发件人的DataContext:
private void SomeCombo_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var item = sender as FrameworkElement;
if (item== null)
return;
var source = item.DataContext;
}
答案 2 :(得分:0)
据我所知,当你点击组合框时,该行应该得到焦点。这也意味着数据网格知道所选项目。
如果您要查找所选对象,则应该可以使用datagridName.SelectedItem
访问该对象。这将返回所选对象。
请测试并评论解决方案,因为我现在无法检查答案。