我找到了一种模板在GridView的列标题中嵌入控件的方法。但是我不知道如何使用后面的代码找到控件以填充项目。我已经想出如何响应嵌入式控件引发的事件并确定它所在的列。否则我不知道如何获得对嵌入式ComboBox的引用。
一些代码可以给你一个想法:
<Page.Resources>
<DataTemplate x:Key="ComboHeaderTemplate">
<DockPanel>
<ComboBox Name="columnHeading" />
</DockPanel>
</DataTemplate>
</Page.Resources>
在代码隐藏中:
GridView grdView = new GridView();
for (int column = 1; column <= context.data.GetLength(1); column++)
{
GridViewColumn gvc = new GridViewColumn();
gvc.DisplayMemberBinding = new Binding(column.ToString());
gvc.Header = column.ToString();
gvc.Width = 120;
gvc.HeaderTemplate = (DataTemplate)this.Resources["ComboHeaderTemplate"];
grdView.Columns.Add(gvc);
}
ListView1.View = grdView;
ListView1.ItemsSource = dt.DefaultView;
如果每个ComboBox都有相同的项目列表可供选择使用数据绑定,只要我可以为每列选择唯一值。
答案 0 :(得分:1)
您可以使用VisualTreeHelper来检索组合框:
创建一个帮助方法以在GridViewColumn上找到组合框:
public T FindVisualChild<T>(DependencyObject depObj) where T : DependencyObject
{
if (depObj != null)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
if (child != null && child is T)
{
return (T)child;
}
T childItem = FindVisualChild<T>(child);
if (childItem != null) return childItem;
}
}
return null;
}
要获得对组合框的引用,请执行以下操作:
ComboBox cb = FindVisualChild<ComboBox>(gvc);
希望这就是你要找的东西?
答案 1 :(得分:1)
这就是我最终的目标。
XAML:
<DataTemplate x:Key="ComboHeaderTemplate">
<DockPanel>
<ComboBox Name="columnHeading" Loaded="columnHeadingLoaded" SelectionChanged="columnHeadingSelectedChanged" Width="Auto" />
</DockPanel>
</DataTemplate>
代码背后:
private void columnHeadingLoaded(object sender, RoutedEventArgs e)
{
((ComboBox)sender).ItemsSource = myList;
((ComboBox)sender).SelectedIndex = 0;
}
// My columns are named "1", "2" etc
private void columnHeadingSelectedChanged(object sender, SelectionChangedEventArgs e)
{
int columnIndex = int.Parse(((ComboBox)sender).DataContext.ToString()) - 1;
if (((ComboBox)sender).SelectedIndex == 0)
{
this.Headings[columnIndex] = null;
}
else
{
this.Headings[columnIndex] = ((ComboBox)sender).SelectedValue.ToString();
}
}
我认为我应该在XAML中使用数据绑定,但这更容易。
答案 2 :(得分:0)
你可以试试这个:
var cbx= gvc.HeaderTemplate.LoadContent() as ComboBox;
gvc
是GridViewColumn