将ComboBoxColumn绑定到WPF DataGrid中DataGrid的ItemsSource的集合

时间:2013-07-10 07:54:38

标签: wpf binding datagrid combobox

请帮我弄清楚如何在WPF的DataGrid中使用ComboBoxColumn。 我正在尝试创建一个设备列表,其中每个设备都在字段“log”中具有动态状态列表。

<DataGrid AutoGenerateColumns="False" Margin="12,6,12,12" Name="dataGrid1" Grid.Row="1"  SelectionUnit="FullRow">
    <DataGrid.Columns>
            ...
         <DataGridComboBoxColumn Header="Log" 
                                 ItemsSource="{Binding log, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:Device}}}"/>
    </DataGrid.Columns>
</DataGrid>

public partial class MainWindow : Window
{
    public ObservableCollection<Device> devices;
    ...
}

public MainWindow() 
{
    ...
    dataGrid1.ItemSource = devices;
}

public class Device : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
    public Device() {log = new ObservableCollection<string>();}
    ...
    private ObservableCollection<string> _log;
    public ObservableCollection<string> log { get { return _log; } 
                                              set { _log = value; OnPropertyChanged("log"); } }
}

您能分享任何建议:我如何在每个对象的数据网格列表“log”中显示每个组合框?

1 个答案:

答案 0 :(得分:4)

MSDN: DataGridComboboxColumns说:

  

要填充下拉列表,请先为其设置ItemsSource属性   ComboBox使用以下选项之一:

     
      
  • 静态资源。有关更多信息,请参阅StaticResource标记扩展。
  •   
  • 一个x:静态代码实体。有关更多信息,请参阅x:静态标记扩展。
  •   
  • ComboBoxItem类型的内联集合。
  •   

所以基本上只是绑定到数据对象的集合属性,最好使用DataGridTemplateColumn

<DataGridTemplateColumn Header="Log">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
             <ComboBox ItemsSource="{Binding log}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

这种类型的专栏也为你提供了更多的模板可能性。