我有一个DataGrid,我试图使用动态DataTemplate填充(取决于上下文,它将显示TextBlock,CheckBox,ComboBox等);我将DataGrid绑定到包含我需要的数据的对象,但是当我将ComboBox单元格的ItemsSource设置为我的对象中包含的DataTable时,我遇到了麻烦:
public class Attribute
{
public int ID { get; set; }
public string Name { get; set; }
public string Type { get; set; }
public string Value { get; set; }
public SqlDataSet.OptionDataTable Options { get; set; }
}
...
List<Attribute> attributes = new List<Attribute>();
...
datagrid.ItemsSource = attributes;
除非我误解了我用于动态单元格类型的方法(这很可能,因为这是我的第一个WPF项目),我不相信我可以选择将我的ComboBoxes直接绑定到我的属性。通过后端代码的选项,这似乎是这种情况的常见答案。
我的XAML:
<DataGrid.Resources>
<DataTemplate x:Key="StringTemplate">
<TextBlock Text="{Binding Value}"/>
</DataTemplate>
<DataTemplate x:Key="OptionTemplate">
<ComboBox ItemsSource="{Binding Source={StaticResource Options}}"
DisplayMemberPath="Description"
SelectedValuePath="OptionID"/>
</DataTemplate>
<local:DataGridCellTemplateSelector x:Key="TemplateSelector"
StringTemplate="{StaticResource StringTemplate}"
OptionTemplate="{StaticResource OptionTemplate}"/>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTemplateColumn Header="Value"
CellTemplateSelector="{StaticResource TemplateSelector}"/>
</DataGrid.Columns>
以这种方式运行时,ComboBox会正确显示,但内容为空。
我的DataGridCellTemplateSelector(based heavily on this):
public class DataGridCellTemplateSelector : DataTemplateSelector
{
public DataTemplate StringTemplate { get; set; }
public DataTemplate OptionTemplate { get; set; }
public override System.Windows.DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container)
{
if (item is Attribute)
{
switch ((item as Attribute).Type)
{
case "Text":
return StringTemplate;
case "Option":
return OptionTemplate;
default:
return null;
}
}
return null;
}
}
如果有办法访问ComboBox以通过代码设置ItemsSource,那也是很棒的。提前感谢您的时间。