Я пытаюсь сделать следующее.У меня есть поле со списком, привязанное к пользовательскому классу с 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.
Любая помощь будет отличной.