0

我在 wpf 用户控件中有一个文本框和一个组合框。ComboxBox 绑定到 ICollectionView (CurencyList),它填充货币对,如 GBP/EUR、CLP/EUR、USD/EUR、EUR/USD 等。每当用户在文本框中写入(例如 EUR)时,组合框应被过滤并显示下拉列表,其中 EUR 为第二种货币。

在此处输入图像描述

为此,我使用过:

 public string Currency
    {
        get { 

            return _criteriaType.currency; }
        set
        {
            if (_criteriaType.currency != value)
            {
                _criteriaType.currency = value.EmptyOrWhiteSpaceAsNull();
                base.OnPropertyChanged("Currency");
                CurrencyList.Filter = new Predicate<object>(Contains);

            }
        }
    }



public bool Contains(object de)
    {
        CurrencyPair o = de as CurrencyPair;
        if (Currency != null || Currency == string.Empty)
        {
           return (o.name.Substring(3, 4).ToLower().Contains(Currency.ToLower()));              
        }
        else
        {
            IsOpen = false;
            OnPropertyChanged("IsOpen");               
            return false;
        }
    }

CurrencyList 来自网络服务:

 private ICollectionView GetCurrencyPair()
    {

        strCurrencyPair.arg0 = (Currency != string.Empty && Currency != null) ? Convert.ToString(Currency).ToUpper() : string.Empty;
        string[][] cPair = ServiceLocator.Resolve<IWebServiceRepository>().BusinessWebService.getCurrenyPairs(strCurrencyPair);

        foreach (string[] item in cPair)
        {
            IList.Add(new CurrencyPair() { name = (Convert.ToString(item[0]).ToUpper() + "/" + Convert.ToString(item[1]).ToUpper()) });

        }
      return  CurrencyList =CollectionViewSource.GetDefaultView(IList);

    }

过滤工作正常。但是当用户使用键盘上的向后箭头键从文本框中删除货币时,组合框被过滤为空,即下拉列表为空。如何克服这个问题。请建议?

4

2 回答 2

1

您需要通过文本更改事件更新您的收藏视图

private void OnTextChanged(object sender, Eventargs e) {
  var vm = yourViewModelOrWhatEver;
  ((ICollectionView)vm.CurrencyList).Refresh();
}

或设置一次过滤谓词并仅在货币更改时触发刷新

public void ctor() {
  CurrencyList.Filter = new Predicate<object>(Contains);
}

public string Currency {
  get { return _criteriaType.currency; }
  set {
    if (_criteriaType.currency == value) {
      return;
    }
    _criteriaType.currency = value.EmptyOrWhiteSpaceAsNull();
    base.OnPropertyChanged("Currency");
    CurrencyList.Refresh(); // refresh/filter the collection view
  }
}

希望有帮助

编辑

你说

过滤工作正常。但是当用户使用键盘上的向后箭头键从文本框中删除货币时,组合框被过滤为空,即下拉列表为空。如何克服这个问题。请建议?

那么你必须将你的谓词函数更改为这个

public bool Contains(object de)
{
    CurrencyPair o = de as CurrencyPair;
    if (Currency != null || Currency == string.Empty) {
      // Currency == string.Empty should also true
      return (Currency == string.Empty) || (o.name.Substring(3, 4).ToLower().Contains(Currency.ToLower()));
    } else {
      IsOpen = false;
      OnPropertyChanged("IsOpen");               
      return false;
    }
}
于 2012-12-26T23:08:34.987 回答
0

我认为问题在于以下语句:

string[][] cPair = ServiceLocator.Resolve().BusinessWebService.getCurronyPairs(strCurrencyPair);

如果您将 string.empty 传递给 strCurrencyPair,那么该服务的返回值是多少,一旦文本框因退格为空,您当前将执行此操作?

于 2012-12-26T20:22:02.487 回答