【问题标题】:Remove already selected value from a combobox in datagridview从 datagridview 的组合框中删除已选择的值
【发布时间】:2014-09-29 09:05:55
【问题描述】:

我在模板列中有一个 wpf datagridview 和和组合框。我不想显示已为其他行选择的值,但在这样做时,当前选择的项目也会被删除。

型号如下

public class MetadataConfigurationModel : ViewModelBase
{        
    private ObservableCollection<MetadataConfiguration> _metadataConfiguration = new ObservableCollection<MetadataConfiguration>();
    public ObservableCollection<MetadataConfiguration> MetadataConfig
    {
        get { return _metadataConfiguration; }
        set { _metadataConfiguration = value; }
    }
    private ObservableCollection<TaxonomyField> _taxonomyList = new ObservableCollection<TaxonomyField>();
    public ObservableCollection<TaxonomyField> TaxonomyList
    {
        get
        {
            ObservableCollection<TaxonomyField> tempTaxanomy = new ObservableCollection<TaxonomyField>(_taxonomyList);
            tempTaxanomy.Add(null);
            tempTaxanomy.Move(tempTaxanomy.Count - 1, 0);
            foreach (MetadataConfiguration mdConfig in _metadataConfiguration.ToList())
            {
                tempTaxanomy.Remove(mdConfig.Field);
            }
            return tempTaxanomy;
        }
        set
        {
            _taxonomyList = value;
        }
    }

    public class MetadataConfiguration : ViewModelBase
    {

        private TaxonomyField _field;
        [XmlIgnore]
        public TaxonomyField Field
        {
            get { return _field; }
            set
            {
                _field = value;
                _isDirty = true;
                _fieldName = _field == null ? String.Empty : _field.Title;
                _fieldGUID = _field == null ? Guid.Empty : _field.Id;
                _termsetGUID = _field == null ? Guid.Empty : _field.TermSetId;
                OnPropertyChanged("Field");
            }
        }

        private string _fieldName;
        public string FieldName
        {
            get { return _fieldName; }
            set { 
                _fieldName = value;
                OnPropertyChanged("FieldName");
            }
        }

        private Guid _fieldGUID;
        public Guid FieldGUID
        {
            get { return _fieldGUID; }
            set { _fieldGUID = value;
            OnPropertyChanged("FieldGUID");
            }
        }

        private Guid _termsetGUID;
        public Guid TermsetGUID
        {
            get { return _termsetGUID; }
            set { _termsetGUID = value;
            OnPropertyChanged("TermsetGUID");
            }
        }
    }
}

ViewModel 按如下方式填充列表

_model.TaxonomyList = new ObservableCollection<TaxonomyField>(_lstTaxonomyFileds);

if (_model.MetadataConfig.Count > 0)
{
    foreach (MetadataConfigurationModel.MetadataConfiguration mdConfig in _model.MetadataConfig)
    {
        mdConfig.Field = (from a in _model.TaxonomyList where a.Id == mdConfig.FieldGUID select a).FirstOrDefault();
    }
}

而xaml如下:

<DataGrid AutoGenerateColumns="False" x:Name="dgMetadataConfig" Grid.Row="2" Grid.Column="0" ScrollViewer.VerticalScrollBarVisibility="Auto" 
        ItemsSource="{Binding MetadataConfig, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Margin="10,0,0,0" CanUserAddRows="False" VerticalAlignment="Top">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Field Name">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox Width="170" SelectedItem="{Binding Field, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                        ItemsSource="{Binding DataContext.TaxonomyList, Mode=TwoWay, 
                        RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}},
                        UpdateSourceTrigger=PropertyChanged}" 
                              Margin="2,2,2,2" DropDownOpened="CmbTaxonomyField_DropDownOpened" DisplayMemberPath="Title" SourceUpdated="CmbTaxonomyField_SourceUpdated"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

在视图模型中,我有一个列表 _lstTaxonomyFileds,用于填充模型中的 TaxonomyList。该列表包含三个项目“AB”、“BC”和“CD”。现在用户将第一行添加到网格中并在组合框中拥有所有三个选项并选择“AB”现在添加另一行并且现在组合框中将只有“BC”和“CD”,直到他从第一行。

【问题讨论】:

  • 我不想显示已经为其他行选择的值是什么意思?
  • 就像在第一行中我选择了“ABC”,那么对于任何其他行,“ABC”都不应出现在组合框中。
  • 听起来 就像您将每个项目的 ComboBox.SelectedItem 属性数据绑定到单个属性一样,但您的 XAML 似乎没问题。因此,我只能假设 您的代码 导致了这个问题。
  • 是的,模型中 TaxonomyList 属性的 get 块正在删除,但这样做会删除所有选定的值,包括当前行的值,我找不到方法可以防止它移除当前选中的项目。
  • 全部选中有什么问题?您应该小心生成具有不自然行为的应用程序,因为这往往会使用户感到困惑。

标签: wpf mvvm datagridview combobox wpfdatagrid


【解决方案1】:

不是一个理想的解决方案,但不知何故我能够让它发挥作用。移动了 MetadataConfiguration 类中的 TaxonomyField 属性,做了一些 linq 魔术并将其绑定到 itemsource。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多