我想做的是以下内容。我有一个组合框绑定到一个自定义类,其中 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));
除了ComboBox上的IsEditable=true部分之外,一切都有效。要求是允许用户输入自己的值,而不必是列表中的事物之一。但是对于必填字段,我还需要验证是否输入或选择了某些内容。
我的问题:
- 我正在使用验证规则进行检查,但对于自定义条目,它总是被发送一个空值。
- 仅当所选内容更改为新的预定义选项时,绑定才会更新。当我键入自定义值或键入的内容偏离预定义选项时,它不会更新。例如,如果 USA 是一个选项,并且我键入 Underpants,则当我键入 U 时,它将更新为美国,但在我键入单词的其余部分时,它会保留在美国。如果我以与列表中任何内容不匹配的字母开头,它将保持为空。
我尝试过什么:
在其他一些类似但不相同的问题的建议下,我尝试添加一个空检查并创建一个新的 LookupValue 到我的 SelectedValue getter。这似乎没有效果。
我还尝试绑定到字符串列表并自己处理与自定义类列表的匹配,但即使对于字符串列表,行为也是相同的。
我已经设法解决了第二个问题,方法是绑定到 KeyUp 事件并在没有匹配项的情况下将 SelectedValue 设置为新的 LookupValue。但这仍然无助于验证规则问题。
任何帮助都会很棒。
经过大量的试验和错误,我找到了以下修复程序,可以满足我的需求。我没有绑定到"选定项"属性,而是绑定到"文本"属性。然后,如果需要,我能够使用丢失焦点事件中输入的信息创建一个新列表项。