WPF工具包自动完成盒不';不要刷新它的数据
在自动完成框中,我选择“AAAA”,它是我个人收藏中第一个人的名字。 之后,我按下按钮,将第一个人的名字改为“Jeniffer”。 代码运行正常,但自动完成框中的选定项似乎没有刷新 更改名称后如何刷新所选项目 XAML:WPF工具包自动完成盒不';不要刷新它的数据,wpf,binding,wpftoolkit,Wpf,Binding,Wpftoolkit,在自动完成框中,我选择“AAAA”,它是我个人收藏中第一个人的名字。 之后,我按下按钮,将第一个人的名字改为“Jeniffer”。 代码运行正常,但自动完成框中的选定项似乎没有刷新 更改名称后如何刷新所选项目 XAML: 更改第一人称 代码隐藏: public partial class Window1 : Window { public delegate void SearchResults(IEnumerable results); public Observable
更改第一人称
代码隐藏:
public partial class Window1 : Window {
public delegate void SearchResults(IEnumerable results);
public ObservableCollection<Person> Persons { get; set; }
public Window1() {
Persons = new ObservableCollection<Person> {
new Person {Name = "AAAA"},
new Person {Name = "BBBB"},
new Person {Name = "CCCC"},
};
InitializeComponent();
}
private void autoCompleteBox_Populating(object sender, PopulatingEventArgs e) {
e.Cancel = true;
Search(autoCompleteBox.SearchText, delegate(IEnumerable results) {
autoCompleteBox.ItemsSource = results;
autoCompleteBox.PopulateComplete();
});
}
private void Search(string phrase, SearchResults resultsDelegate) {
var results = new ObservableCollection<Person>();
foreach (var person in Persons) {
if (person.Name.ToLower().Contains(phrase.ToLower())) {
results.Add(person);
}
}
resultsDelegate(results);
}
private void Button_Click(object sender, RoutedEventArgs e) {
Persons.FirstOrDefault(p => p.Name == "Aaaaa").Name = "Jennifer";
}
}
public class Person {
public string Name { get; set; }
public override string ToString() {
return Name;
}
}
公共部分类窗口1:窗口{
公共委托无效搜索结果(IEnumerable results);
公共可观察集合人员{get;set;}
公共窗口1(){
人员=新观察到的集合{
新人{Name=“AAAA”},
新人{Name=“BBBB”},
新人{Name=“CCCC”},
};
初始化组件();
}
私有void自动完成框填充(对象发送方,填充事件参数e){
e、 取消=真;
搜索(autoCompleteBox.SearchText,委托(IEnumerable results){
autoCompleteBox.ItemsSource=结果;
autoCompleteBox.PopulateComplete();
});
}
私有无效搜索(字符串短语、搜索结果resultsDelegate){
var结果=新的ObservableCollection();
foreach(var个人对个人){
if(person.Name.ToLower().Contains(phrase.ToLower())){
结果:增加(人);
}
}
结果代表(结果);
}
私有无效按钮\u单击(对象发送者,路由目标e){
Persons.FirstOrDefault(p=>p.Name==“Aaaaa”).Name=“Jennifer”;
}
}
公共阶层人士{
公共字符串名称{get;set;}
公共重写字符串ToString(){
返回名称;
}
}
最简单的方法是更改文本属性:
private void Button_Click(object sender, RoutedEventArgs e)
{
Persons.FirstOrDefault(p => p.Name == "AAAA").Name = "Jennifer";
if(autoCompleteBox.Text == "AAAA")
autoCompleteBox.Text = "Jennifer";
}
由于文本字段与SelectedItem属性无关,因此它仅与text属性连接。您尚未实现INotifyPropertyChanged。也许这是问题的根源。我将测试你的代码,并说我的假设是否正确。不需要测试@vortex,这是部分原因。另一个问题是使用适当的显示成员。什么是适当的显示成员?@vortex-INotifyPropertyChanged没有帮助。您还必须更改Text属性,因为这个属性和其他属性是分开的,并且没有观察到绑定模型的变化。谢谢@vorrtex,但是这段代码只是为了显示我的问题。在实际代码中,列表不会在按钮单击事件中更改,而是在ViewModel中更改。我的视图中只有AutoCompletBox。因此,我注意到名称正在更改的范围。@Erez您可以将自动完成框的Text属性绑定到ViewModel的任何属性。我看不出有什么问题不能解决。如果你编辑你的问题并提供更接近真实代码的代码,我会回答。
private void Button_Click(object sender, RoutedEventArgs e)
{
Persons.FirstOrDefault(p => p.Name == "AAAA").Name = "Jennifer";
if(autoCompleteBox.Text == "AAAA")
autoCompleteBox.Text = "Jennifer";
}