IsEditable、ItemsSource 和 ValidationRule 的 WPF

我正在尝试做的是以下内容。我有一个绑定到自定义类的组合框,其中 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 问题。

任何帮助都会很棒。


交互式爱情
浏览 166回答 1
1回答

冉冉说

经过大量的反复试验,我找到了以下修复程序,可以满足我的需求。我没有绑定到 SelectedItem 属性,而是绑定到 Text 属性。然后,如果在失去焦点事件中需要,我可以使用输入的信息创建一个新的列表项。
打开App,查看更多内容
随时随地看视频慕课网APP