WPF ComboBox взаимодействие IsEditable, ItemsSource и ValidationRule - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь сделать следующее.У меня есть поле со списком, привязанное к пользовательскому классу с ItemsSource, DisplayMembePath установлен в свойство этого класса.Это само по себе прекрасно работает, все привязки работают.Перейдите к моим проблемам.

        <ComboBox Name="Field" Width="{Binding FieldWidth}" ItemsSource="{Binding LookupValues}" DisplayMemberPath="Description" SelectedValue="{Binding SelectedValue}" 
              Grid.Column="1" HorizontalAlignment="{Binding FieldAlignment}" Margin="{Binding FieldMargin}" IsEditable="True"/>

Мой пользовательский класс довольно прост:

public class LookupValue : ILookupValue
{
    public LookupValue() { }
    public LookupValue(CODETABLE codeTable)
    {
        Id = codeTable.ID;
        Name = codeTable.CODE;
        Description = codeTable.DESCR;
    }
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public int? Sequence { get; set; }
    public override bool Equals(object obj)
    {
        if (obj is LookupValue)
        {
            LookupValue lookupValue = (LookupValue)obj;
            return Id == lookupValue.Id && String.Compare(Name, lookupValue.Name) == 0 && String.Compare(Description, lookupValue.Description) == 0;
        }
        return false;
    }

    public override int GetHashCode()
    {
        return Id;
    }

Как и соответствующий раздел модели моего вида

    public ILookupValue SelectedValue
    {
        get {
            return (ILookupValue)GetValue(SelectedValueProperty);
        }
        set { SetValue(SelectedValueProperty, value); NotifyPropertyChanged("SelectedValue"); }
    }

    public static readonly DependencyProperty SelectedValueProperty =
        DependencyProperty.Register("SelectedValue", typeof(ILookupValue), typeof(MarriageComboBox), new PropertyMetadata(new MarriageLookupValue(), SelectedValueChanged));

    private static void SelectedValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        MarriageComboBox box = d as MarriageComboBox;
    }

    public IList<ILookupValue> LookupValues
    {
        get { return (IList<ILookupValue>)GetValue(LookupValuesProperty); }
        set { SetValue(LookupValuesProperty, value); NotifyPropertyChanged("LookupValues"); }
    }

    public static readonly DependencyProperty LookupValuesProperty =
        DependencyProperty.Register("LookupValues", typeof(IList<ILookupValue>), typeof(MarriageComboBox), new PropertyMetadata(null));

Все работает, кроме части IsEditable = true в ComboBox.Требование состоит в том, что пользователю разрешено вводить свои собственные значения, и это не обязательно должно быть одной из вещей в списке.Но для обязательных полей мне также нужно проверить, что что-то было введено или выбрано.

Мои проблемы:

  • Я использую ValidationRules для проверки, но для пользовательских записей всегда отправляется нулевое значение.
  • Привязка обновляется только всякий раз, когда выбор изменяется на новый предопределенный параметр.Он не обновляется, когда я набираю пользовательское значение или когда то, что я печатаю, отличается от предопределенной опции.Например, если в качестве опции выбран вариант «США», и я набираю «Трусы», он будет обновляться до «США» при вводе буквы «U», но затем останется в «США», пока я наберу остальную часть слова.И если я начну с буквы, не соответствующей никому из списка, она останется пустой.

Что я пробовал:

  • По совету других похожих, но не совпадающих вопросов, я попытался добавить нулевую проверку и создать новый LookupValue для моего метода SelectedValue.Похоже, это не имеет никакого эффекта.

  • Я также пытался связать список строк и обрабатывать сопоставление с моим списком пользовательских классов самостоятельно, но даже для списка строкповедение такое же.

  • Мне удалось обойти вторую проблему, привязав событие KeyUp и установив для SelectedValue новое LookupValue, если совпадения нет.Но это все еще не помогает с проблемой ValidationRules.

Любая помощь будет отличной.

1 Ответ

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

После долгих проб и ошибок я нашел следующее исправление, позволяющее получить то, что я хочу.Вместо привязки к свойству SelectedItem я привязал к свойству Text.Затем я смог создать новый элемент списка с введенной информацией, если необходимо, в событии потерянного фокуса.

...