我有这个问题,如果您能帮助我,我将不胜感激。我有一个带有public ObservableCollection<IProfile> Profiles { get; set; }
属性的ViewModel,它填充了DataGrid。在DataGrid内部,有一个ComboBox列:
<DataGridComboBoxColumn
Header="Header"
Width="*"
Visibility="{Binding SelectedType, Converter={Commons:ProfileVisibilityConverter}}"
ItemsSource="{Binding PotentialReinforces}"
SelectedValueBinding="{Binding SectionID, UpdateSourceTrigger=LostFocus, Mode=TwoWay}"
DisplayMemberPath="Name"
SelectedValuePath="ReinforceID"/>
我不能使用静态的ItemSource,因为每一行的ComboBox源与其他行相比都是不同的。因此,我需要动态的ItemSource在配置文件类中,我如下定义了PotentialReinforces,它为每个对象提供了合适的结果:
public ObservableCollection<Section> PotentialReinforces
{
get
{
var Ids = this != null ? Database.Reinforces.Get.Where(x => x.BlongID == this.SectionID).Select(x => x.SectionID.Value) : new int[0];
if (Ids.Count() > 0)
{
return new ObservableCollection<Section>(Database.ReinforceSections.Get.Where(x => Ids.Contains(x.SectionID)));
}
else return null;
}
}
当我调试代码时,根据我的设计,每个Profile对象都有潜在的集合,但是Combobox不会将集合识别为其ItemSource。谢谢您的帮助。
我使用对DataGridComboBoxColumn
的更改解决了这个问题,这是我从Joe那里学到的page。这只是定义了一种新型的DataGridComboBoxColumn来解决该问题。
public class DataGridComboBoxColumnWithBindingHack : DataGridComboBoxColumn
{
protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem)
{
FrameworkElement element = base.GenerateEditingElement(cell, dataItem);
CopyItemsSource(element);
return element;
}
protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
{
FrameworkElement element = base.GenerateElement(cell, dataItem);
CopyItemsSource(element);
return element;
}
private void CopyItemsSource(FrameworkElement element)
{
BindingOperations.SetBinding(element, ComboBox.ItemsSourceProperty,
BindingOperations.GetBinding(this, ComboBox.ItemsSourceProperty));
}
}
<Commons:DataGridComboBoxColumnWithBindingHack
Header="Header"
Width="*"
Visibility="{Binding SelectedType, Converter={Commons:ProfileVisibilityConverter}}"
ItemsSource="{Binding PotentialReinforces}"
SelectedValueBinding="{Binding ReinforceID, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
DisplayMemberPath="Name"
SelectedValuePath="SectionID"/>