选择基于文本框文本的列表框项

时间:2019-07-12 08:29:47

标签: c# wpf

这是我想做的事情: 我有一个文本框和一个列表框:

 <GroupBox Header="SAISIE ADRESSE">
    <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
        <Label Content="ADRESSE"/>
        <TextBox x:Name="AdrManuel_Textbox" Height="30"
                             Text="{Binding SearchText,UpdateSourceTrigger=PropertyChanged}"/>
        <ListBox x:Name="SearchPicking_LB" ScrollViewer.CanContentScroll="True"
                             MouseDoubleClick="SearchPicking_LB_MouseDoubleClick"
                             ItemsSource="{Binding MyFilteredItems}" Background="LightGray"
                             Width="150" Height="100" Margin="8"/>
    </StackPanel>
</GroupBox>

然后,例如,用户可以在文本框中输入“ 30”,并且将显示列表框中包含“ 30”的所有项目。

Pics

但是cs代码不起作用(如您在图片上看到的),但是没有引发错误。

代码如下:

public partial class Adr_Palettes : Page,INotifyPropertyChanged
{
    private string _searchText;
    public string SearchText
    {
        get { return _searchText; }
        set
        {
            _searchText = value;
            OnPropertyChanged("SearchText");
        }
    }

    public List<string> MyItems { get; set; }
    public IEnumerable<string> MyFilteredItems
    {
        get
        {
            if (SearchText == null) return MyItems;
            return MyItems.Where(x=>x.ToUpper().Contains(SearchText.ToUpper()));
        }
    }
    private void OnPropertyChanged(string v)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(v));
    }

    public Adr_Palettes()
    {
        InitializeComponent();
    }

    public event PropertyChangedEventHandler PropertyChanged;


    private void SearchPicking_LB_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {

    }

    private void Page_Loaded(object sender, RoutedEventArgs e)
    {
        using(BdCretsDataContext dc=new BdCretsDataContext())
        {
            var picking = (from p in dc.PICKING
                          where p.ART_CODE == null && p.ENT_ID == null
                          orderby p.R_ID
                          select new
                          {
                              p.R_ADRESSE
                          }).ToList();
            SearchPicking_LB.ItemsSource = picking.Select(row => row.R_ADRESSE);
            MyItems = new List<string>();

            foreach (string item in SearchPicking_LB.Items)
            {
                MyItems.Add(item);
            }
            this.DataContext = this;
        }
    }
}

有人可以告诉我代码有什么问题吗?

2 个答案:

答案 0 :(得分:0)

我建议的解决方案。

对于代码:

public string SearchText 
{
    get { return _searchText; } 
    set
    {
        if (_searchText == value)
            return;
        _searchText = value; 
        OnPropertyChanged("SearchText");
        OnPropertyChanged("MyFilteredItems"); 
    } 
}

以及有关UI代码的建议:

<TextBox x:Name="AdrManuel_Textbox" Height="30"
                         Text="{Binding SearchText,UpdateSourceTrigger=PropertyChanged, Delay=250}"/>

答案 1 :(得分:0)

尝试以下方法。 如下更改您的MyFilteredList

公共IList MyFilteredList

{

 get;
 private set;

} =新的ObserverableCollection();

添加以下私有方法

private void Filter()    {

    MyFilteredList.Clear();
   foreach(string s in MyItems)
   {
     if(SearchText==null||s.Toupper().Contains(SearchText.ToUpper())
       { 
              MyFilteredList.Add(s);
        }
    }
}

在SearchText属性调用Filtert方法的集合中,这应该对您有用。

这实际上是解决方案的扩展版本,区别在于更新MyFilitetedList的同一对象