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

问题描述 投票:0回答:1

我有这个问题,如果您能帮助我,我将不胜感激。我有一个带有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。谢谢您的帮助。

c# wpf datagridcomboboxcolumn itemsource
1个回答
0
投票

我使用对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"/>
© www.soinside.com 2019 - 2024. All rights reserved.