通过XAML将WPF Combobox绑定到DataTable

时间:2013-11-22 04:37:34

标签: c# wpf xaml

我有一个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,那也是很棒的。提前感谢您的时间。

0 个答案:

没有答案