Как привязать числа к DataGridComboBoxColumn без повторяющихся значений в WPF

Я работаю над примером приложения, где у меня есть DataGrid, скажем, 5 строк и 2 столбца. 2-й столбец — это DataGridComboBoxColumn, который указывает приоритет 1-го столбца. Таким образом, пользователь может выбрать приоритет 5 строк из выпадающих списков во 2-м столбце. Мы должны привязать список, содержащий числа от 1 до 6, к DataGridComboBoxColumn.

Проблема в том, что если 1-й ComboBox выбран 1, то он не должен отображаться в остальных ComboBox. То же самое и для остальных ComboBox. Просто дайте мне хоть какой-то намек, как этого добиться. Я использую С#, WPF

Заранее спасибо..


person Ajay Kumar    schedule 15.06.2017    source источник
comment
Кто-то может возразить, что список, который пользователь может изменить, был бы лучшим пользовательским интерфейсом. Вы хотите сказать, что комбо начнется без выбора? что, если пользователь совершит ошибку или передумает? Вам придется сбросить и заставить их начать все сначала.   -  person Crowcoder    schedule 15.06.2017
comment
@Crowcoder Если я напрямую привязываю список или ObservableCollection к DataGridComboBoxColumn, они могут выбрать одно и то же число более одного раза. Так и хотелось бы сделать...   -  person Ajay Kumar    schedule 15.06.2017
comment
Тогда я не понимаю, потому что вы также говорите, что ... не должно появляться в остальных полях со списком.   -  person Crowcoder    schedule 15.06.2017
comment
Я согласен с @Crowcoder, что Orderable List был бы лучшим пользовательским интерфейсом для этого сценария.   -  person Naresh Ravlani    schedule 15.06.2017


Ответы (1)


Вы можете использовать триггер данных

      <Style x:Key="SingleSelectionComboBoxItem" TargetType="ComboBoxItem" BasedOn="{StaticResource {x:Type ComboBoxItem}}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Selected}" Value="True">
                    <!-- Hide it -->
                    <Setter Property="Visibility" Value="Collapsed" />
                    <!-- Also prevent user from selecting it via arrows or mousewheel -->
                    <Setter Property="IsEnabled" Value="False" />
                </DataTrigger>
            </Style.Triggers>
        </Style>

поэтому ваш Combobox будет выглядеть так:

                                <ComboBox ItemContainerStyle="{StaticResource SingleSelectionComboBoxItem}" Path=Selection}"  SelectionChanged="SingleSelectionComboBox_SelectionChanged" DisplayMemberPath = "Number"/>

Код позади:

 private void SingleSelectionComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        foreach (var item in e.RemovedItems.OfType<PopolazioneCombo>())
        {
            item.Selected = false;
        }

        foreach (var item in e.AddedItems.OfType<PopolazioneCombo>())
        {
            item.Selected = true;
        }
    }

Затем вы определили класс в своей ViewModel следующим образом:

    public class ComboBoxPopulation : INotifyPropertyChanged
{
    public string Number { get; set; }
    private bool selected = false;
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propName)
    {
        var handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propName));
        }
    }
    public bool Selected
    {
        get { return selezionato; }
        set
        {
            if (selezionato != value)
            {
                selezionato = value;

                OnPropertyChanged("Selected");
            }
        }
    }
}

Ваш источник элемента будет выглядеть так:

 public ObservableCollection<ComboBoxPopulation> Selezione
    {
        get
        {
            return selezione;
        }
        set
        {
            if (selezione != value)
            {
                selezione = value;
                OnPropertyChanged("Selezione");
            }
        }
    }
person Daniele Sartori    schedule 15.06.2017