WPF DataGrid在DataGridComboBoxColumn上进行分组

时间:2013-12-09 21:04:54

标签: c# wpf xaml datagrid

我有一个DataGrid分组问题,我认为这个问题与 (可能不正确)我绑定对象列表的方式 到DataGridComboBoxColumn。我在这里和谷歌搜索过解决方案 并没有发现任何有效的东西。

  1. 我有一个分类:

    public class Category : INotifyPropertyChanged, IEditableObject
    {
    public event PropertyChangedEventHandler PropertyChanged;
    
    // Data for undoing canceled edits.
    private Category temp_Category = null;
    private bool bEditing = false;
    
    private void NotifyPropertyChanged(string name)
      {
      if (PropertyChanged != null)
        {
        PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
      }//NotifyPropertyChanged
    
    private byte _categoryID;
    public byte ID
      {
      get { return _categoryID; }
      set { _categoryID = value; this.NotifyPropertyChanged("ID"); }
      }
    
    private string _categoryText;
    public string CategoryText
      {
      get { return _categoryText; }
      set { _categoryText = value.Trim(); this.NotifyPropertyChanged("CategoryText"); }
      }
    
    // Implement IEditableObject interface.
    public void BeginEdit()
      {
      if (this.bEditing == false)
        {
        this.temp_Category = this.MemberwiseClone() as Category;
        this.bEditing = true;
        }
      }
    
    public void CancelEdit()
      {
      if (this.bEditing == true)
        {
        this.ID = temp_Category.ID;
        this.CategoryText = temp_Category.CategoryText;
        this.bEditing = false;
        }
      }
    
    public void EndEdit()
      {
      if (this.bEditing == true)
        {
        this.temp_Category = null;
        this.bEditing = false;
        }
      }
    }   
    
  2. ...以及用作DataGridComboBoxColumn的ItemSource的List Categories集合。 该列表是应用程序模型的一部分,并在启动时填充。

  3. 我有一个ObservableCollection(名为ItemsIN)的项目,每个项目都有一个名为“Classification”的Category属性。

  4. 使用模型中的DataContext属性在XAML中设置DataGrid的ItemsSource:

  5. 代码背后:

    this.Groups = new ListCollectionView(ItemsIN);
    this.Groups.GroupDescriptions.Add(new PropertyGroupDescription("Classification.CategoryText"));
    

    XAML:

        <DataGrid AutoGenerateColumns="False" HorizontalAlignment="Stretch" 
            ItemsSource="{Binding Groups}"
        Name="dataGridVariants" VerticalAlignment="Top"  
        VerticalContentAlignment="Center" 
        HorizontalContentAlignment="Stretch" 
        IsSynchronizedWithCurrentItem="{x:Null}"
        CanUserAddRows="False"
        .... etc. etc., styles, column definitions, etc.
        </DataGrid>
    
    1. 这是DataGridComboBoxColumn的XAML:

      <DataGridComboBoxColumn.ElementStyle>
          <Style TargetType="ComboBox">
              <Setter Property="ItemsSource" Value="{Binding Path=DataContext.Categories, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
              <Setter Property="IsReadOnly" Value="True"/>
              <Setter Property="Background" Value="LightGreen"/>
              <Setter Property="ItemTemplate">
                  <Setter.Value>
                      <DataTemplate>
                          <TextBlock Text="{Binding Path=Category.CategoryText}"/>
                      </DataTemplate>
                  </Setter.Value>
              </Setter>
          </Style>
      </DataGridComboBoxColumn.ElementStyle>
      
      <DataGridComboBoxColumn.EditingElementStyle>
          <Style TargetType="ComboBox">
              <Setter Property="ItemsSource" Value="{Binding Path=DataContext.Categories, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
              <Setter Property="Background" Value="LightGreen"/>                            
              <Setter Property="ItemTemplate">
                  <Setter.Value>
                      <DataTemplate>
                          <TextBlock Text="{Binding Path=Category.CategoryText}"/>
                      </DataTemplate>
                  </Setter.Value>
              </Setter>                            
          </Style>
      </DataGridComboBoxColumn.EditingElementStyle>
      

    2. 使用DataGridComboBoxColumn项可以很好地加载网格。然而, 当我更改项目的类别时,分组无法反映类别 更改。例如,如果我在A类中显示了四个项目,则更改类别 一个项目到B,我应该得到两个类别组,一个用于A,一个用于B,但我明白了 一组包含A类中的三个项目和B类中的一个项目。

    3. 如果有人能看到我的错误,我会非常感激!

2 个答案:

答案 0 :(得分:1)

感谢您的建议。我通过将ComboBoxColumn ItemsSource绑定更改为 -

来使分组工作
`SelectedItemBinding="{Binding Category, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"` 

类似于对象项的Winforms DataGridView ComboBoxColumn绑定。我得出结论,UI分组代码依赖于检测与要分组的项目相关联的文本值的变化,在本例中为CategoryText。分组工作正常;但是,在初始化DataGrid ComboBoxColumn时,它不会显示与项目行关联的类别。组合框下拉列表填充正确,但DisplayMemberPath的绑定必定是错误的。

答案 1 :(得分:0)

试试这个(代码中):

this.Groups.DataContext = new ListCollectionView(ItemsIN);

或itemsIN是ObservableCollection

this.Groups.DataContext = itemsIN;

这是因为你引用了DataContext。

<Setter Property="ItemsSource" Value="{Binding Path=DataContext.Categories, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>

但是我没有看到你明确分配给它的任何地方。 我认为这将使你的绑定得到修复。

这是取自http://msdn.microsoft.com/en-us/library/system.windows.controls.datagridcomboboxcolumn(v=vs.110).aspx

的示例
<DataGridComboBoxColumn Header="Order Status"  SelectedItemBinding="{Binding Status}" ItemsSource="{Binding Source={StaticResource myEnum}}" />

可能值得查看您的itemssource。你有ObservableCollection这是一个不错的选择,但我认为在代码/集合中完成其余的绑定可能会更好。

我会更多地了解这一点并在此回复您,同时我建议您查看该链接,如果您还没有。特别是底部的例子。

如果您碰巧解决了这个问题,可能是基于我推荐的内容,那么好消息我建议发布您的解决方案。一旦我有机会,我会在此期待。