我有一个DataGrid分组问题,我认为这个问题与 (可能不正确)我绑定对象列表的方式 到DataGridComboBoxColumn。我在这里和谷歌搜索过解决方案 并没有发现任何有效的东西。
我有一个分类:
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;
}
}
}
...以及用作DataGridComboBoxColumn的ItemSource的List Categories集合。 该列表是应用程序模型的一部分,并在启动时填充。
我有一个ObservableCollection(名为ItemsIN)的项目,每个项目都有一个名为“Classification”的Category属性。
使用模型中的DataContext属性在XAML中设置DataGrid的ItemsSource:
代码背后:
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>
这是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>
使用DataGridComboBoxColumn项可以很好地加载网格。然而, 当我更改项目的类别时,分组无法反映类别 更改。例如,如果我在A类中显示了四个项目,则更改类别 一个项目到B,我应该得到两个类别组,一个用于A,一个用于B,但我明白了 一组包含A类中的三个项目和B类中的一个项目。
如果有人能看到我的错误,我会非常感激!
答案 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}}}"/>
但是我没有看到你明确分配给它的任何地方。 我认为这将使你的绑定得到修复。
的示例<DataGridComboBoxColumn Header="Order Status" SelectedItemBinding="{Binding Status}" ItemsSource="{Binding Source={StaticResource myEnum}}" />
可能值得查看您的itemssource。你有ObservableCollection
这是一个不错的选择,但我认为在代码/集合中完成其余的绑定可能会更好。
我会更多地了解这一点并在此回复您,同时我建议您查看该链接,如果您还没有。特别是底部的例子。
如果您碰巧解决了这个问题,可能是基于我推荐的内容,那么好消息我建议发布您的解决方案。一旦我有机会,我会在此期待。