Не позволяйте двум комбинированным спискам выбирать один и тот же элемент - PullRequest
0 голосов
/ 12 сентября 2018

Я ищу способ запретить двум (или более) ComboBoxes иметь одинаковые SelectedItem. У меня есть несколько ComboBoxes, которые имеют одинаковые ItemsSource, каждый из которых связан с отдельным свойством в модели представления.

<ComboBox Width="50" ItemsSource="{Binding Keys}" SelectedItem="{Binding LoadedBackgroundKey, NotifyOnValidationError=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
<ComboBox Width="50" ItemsSource="{Binding Keys}" SelectedItem="{Binding LoadedForegroundKey, NotifyOnValidationError=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
<ComboBox Width="50" ItemsSource="{Binding Keys}" SelectedItem="{Binding IncreaseSizeKey, NotifyOnValidationError=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

и т.д.. В ViewModel:

public Key LoadedBackgroundKey { get; set; }
public Key LoadedForegroundKey { get; set; }
public Key IncreaseSizeKey { get; set; }
private ObservableCollection<Key> _availableKeys;
public IEnumerable<Key> Keys => _availableKeys;

Когда загружается модель вида, _availableKeys заполняется соответствующими клавишами (A, B и т. Д.). Я хочу иметь возможность предотвратить выбор одного и того же ключа в нескольких комбинированных списках или (как минимум) выдавать ошибку, когда один и тот же ключ выбран в нескольких полях.

Этот вопрос может быть похож на то, что я ищу, но я не уверен, что он вполне работает (возможно, я просто не понимаю его правильно). Это также относится только к случаю двух ComboBoxes. Хотя я отображаю только 3, я хочу, чтобы это масштабировалось на несколько Comboboxes. ValidationRule лучший подход? Если так, как бы я это реализовал, проверив все ComboBoxes? Или есть более простой подход?

1 Ответ

0 голосов
/ 12 сентября 2018

Вы можете реализовать интерфейс INotifyDataErrorInfo в своей модели представления и выполнять логику проверки всякий раз, когда установлено какое-либо из задействованных свойств, например ::

public class ViewModel : INotifyDataErrorInfo
{
    public Key LoadedBackgroundKey
    {
        get => keys[0];
        set
        {
            Validate(nameof(LoadedBackgroundKey), value);
            keys[0] = value;
        }
    }

    public Key LoadedForegroundKey
    {
        get => keys[1];
        set
        {
            Validate(nameof(LoadedForegroundKey), value);
            keys[1] = value;
        }
    }

    public Key IncreaseSizeKey
    {
        get => keys[2];
        set
        {
            Validate(nameof(IncreaseSizeKey), value);
            keys[2] = value;
        }
    }

    public IEnumerable<Key> Keys { get; } = new ObservableCollection<Key> { ... };

    private void Validate(string propertyName, Key value)
    {
        if (keys.Contains(value))
            _validationErrors[propertyName] = "duplicate...";
        else
            _validationErrors.Remove(propertyName);

        ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
    }

    private readonly Key[] keys = new Key[3];
    private readonly Dictionary<string, string> _validationErrors = new Dictionary<string, string>();
    public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
    public bool HasErrors => _validationErrors.Count > 0;
    public IEnumerable GetErrors(string propertyName) =>
        _validationErrors.TryGetValue(propertyName, out string error) ? new string[1] { error } : null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...