DataGridComboBox C#中每一行的项目源绑定唯一

我遇到了这个问题,如果您能帮助我,我将不胜感激。
我有一个带有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
在Profile类内部,我定义了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。
谢谢您的帮助。

jiansiliangjian 回答:DataGridComboBox C#中每一行的项目源绑定唯一

我通过对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"/>
本文链接:https://www.f2er.com/3005857.html

大家都在问