DataGridTemplateColumn中的WPF ComboBox与备用ItemsSource

时间:2011-03-23 01:23:32

标签: c# wpf data-binding datagrid

我知道这个话题之前出现了几次,但我已经尝试过我在这里找到的方法,但似乎都没有。我不知道是不是因为我使用了不同的绑定源,或者我只是失败了,或者是什么......

我有一个DataGrid绑定到读入内存的XML文档。我有一个List,其中包含一列可能存在的所有不同值,并希望将其用作ComboBox列的ItemsSource。

我的XAML如下:

<DataGrid AutoGenerateColumns="False" IsReadOnly="False"  Height="400" HorizontalAlignment="Left" Margin="125,15,0,0" x:Name="dg" VerticalAlignment="Top" Width="500">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" Width="40*" Binding="{Binding Path=Element[name].Value}" />
        <DataGridTextColumn Header="Count" Width="10*" Binding="{Binding Path=Attribute[count].Value}" />

<!-- I want this to be a ComboBox in a DataGridTemplateColumn -->
        <DataGridTextColumn Header="Category" Width="25*" Binding="{Binding Path=Attribute[category].Value}" /> 

        <DataGridTextColumn Header="Image Path" Width="25*" Binding="{Binding Path=Element[image].Value}" />
    </DataGrid.Columns>
</DataGrid>

显示的示例XML节点如下所示:

<entry count="1" category="someCategory">
    <name>Entry 1</name>
    <image>c:\image.png</image>
</entry>

最后,我想用作ComboBoxes的ItemsSource的列表:

var categories = from category in xmlDoc.Root.Elements("entry") select category .Attribute("category").Value;
List<string> catList= categories .ToList<string>();

因此,当用户编辑类别字段时,我希望他们有一个包含列表中包含的可能值的下拉列表。


编辑:最后得到了这个工作,我按照接受的答案中的说明,将ComboBox的ItemsSource设置为

ItemsSource="{DynamicResource categoryList}"

然后在创建我想用来填充ComboBoxes的列表项后在代码中执行此操作:

Resources["categoryList"] = catList;

1 个答案:

答案 0 :(得分:0)

您必须使用CellTemplate和CellEditingTemplate构建DataGridTemplateColumn。以下内容应该为您提供正确的启动方向

<DataGridTemplateColumn Header="Category" Width="100">
  <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
      <TextBlock Text="{Binding YourProperty}" "/>
    </DataTemplate>
  </DataGridTemplateColumn.CellTemplate>
  <DataGridTemplateColumn.CellEditingTemplate>
    <DataTemplate>
      <ComboBox ItemsSource="{Binding YourSource, Mode=OneTime or OneWay}"
      </ComboBox>
    </DataTemplate>
   </DataGridTemplateColumn.CellEditingTemplate>          
 </DataGridTemplateColumn>