这是我想做的事情: 我有一个文本框和一个列表框:
<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”的所有项目。
但是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;
}
}
}
有人可以告诉我代码有什么问题吗?
答案 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的同一对象