2012-10-04 78 views
0

访问Combobox.ItemSource性质,如果我使用如何内DataGridTemplateColumn

comboboxColumn1.ItemsSource = comboboxSource; 

如果我现在用DataGridTemplateColumn,而不是有DataGridComboBoxColumn在XAML

<DataGridComboBoxColumn Header="Department Id" x:Name="comboboxColumn1" 

可以参考我的comboboxColumn1.Itemsource代码。 ..

<DataGridTemplateColumn x:Name="Col2" Header="name"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <ComboBox x:Name="Combobox2" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 
</DataGrid.Columns> 

然后,我该如何在代码中设置Combobox2.ItemSource ?

回答

2

是不是要在代码后面?

您正在构建一个DataTemplate,它是WPF随时需要呈现该特定DataGridCell的模板。因此,从来没有一个ComboBox实例,而是与显示DataGridCells的实例数量一样多(这就是为什么您实际上无法通过Name引用该项目)。

如果我设置在代码隐藏的ItemsSource,我只想把对组合框一个Loaded事件,并在那里。

或者如果ItemsSource不是静态的,那么您可以使用ItemContainerGenerator来获取特定DataGrid项目的模板,并通过它找到它。

不过说真的,你应该使用StaticResource,或者如果可以绑定设置ItemsSource在XAML,所以我建议搞清楚如何使用RelativeSourceElementName结合会发现无论对象设置通过XAML绑定首先包含您的ItemsSource,并且只有在您绝对必须使用代码隐藏时才算作决定。

另外,为什么comboboxColumn1.ItemsSource = comboboxSource;作品是因为你设置DataGridComboBoxColumn.ItemsSource,不ComboBox.ItemsSource,而且也只有一个名为comboboxColumn1

+0

由于单个对象这样做的原因 - 现在我已经尝试使用设置的ItemsSource在XAML'< ComboBox ItemsSource =“{Binding comboBoxSelections}”/>'其中comboBoxSelections在MainWindow中定义为'public Dictionary comboBoxSelections;' - 即使comboBoxSelections包含项目,组合框也是空的。任何线索为什么? – user3357963

+0

@ooo您需要更改绑定的来源,告诉它在您的MainWindow而不是DataGrid项目中查找属性。你可以给你的MainWindow一个'x:Name'并在你的绑定中使用'ElementName = MyWindowName',或者在绑定中使用'RelativeSource = {RelativeSource AncestorType = {x:Window}}'来告诉它查找VisualTree为一个Window对象 – Rachel