我正在尝试做的是以下内容。我有一个绑定到自定义类的组合框,其中 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"); }
}
除了 ComboBox 上的 IsEditable=true 部分外,一切正常。要求是允许用户输入他们自己的值,而不必是列表中的内容之一。但是对于必填字段,我还需要验证是否输入或选择了某些内容。
我的问题:
我正在使用 ValidationRules 进行检查,但对于自定义条目,它总是会发送一个空值。
只要选择更改为新的预定义选项,绑定只会更新。当我输入自定义值或我输入的内容偏离预定义选项时,它不会更新。例如,如果 USA 是一个选项,我输入 Underpants,当我输入 U 时它会更新为 USA,但在我输入其余单词时会停留在 USA。如果我从一个与列表中任何内容都不匹配的字母开始,它将保持为空。
我试过的:
根据其他一些类似但不相同的问题的建议,我尝试向我的 SelectedValue getter 添加一个空检查并创建一个新的 LookupValue。这似乎没有任何效果。
我还尝试绑定到字符串列表并自己处理与我的自定义类列表的匹配,但即使对于字符串列表,行为也是相同的。
我已经设法解决了第二个问题,方法是绑定 KeyUp 事件并将 SelectedValue 设置为新的 LookupValue(如果没有匹配项)。但这仍然无助于 ValidationRules 问题。
任何帮助都会很棒。
冉冉说
相关分类