【问题标题】:WPF tool kit AutoCompleteBox doesn't refresh its dataWPF 工具包 AutoCompleteBox 不刷新其数据
【发布时间】:2011-03-20 09:39:54
【问题描述】:

在 AutoCompleteBox 中,我选择“AAAA”,女巫是我的 Persons 集合中第一个人的名字。 之后,我按下将第一个人的名字更改为“Jeniffer”的按钮。 代码工作正常,但 AutocompleteBox 所选项目似乎没有刷新。

更改名称后如何使所选项目刷新?

XAML:

  <Grid Background="LightBlue" >
    <Grid.RowDefinitions>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
    </Grid.RowDefinitions>
    <Controls:AutoCompleteBox x:Name="autoCompleteBox" Populating="autoCompleteBox_Populating" Height="30">
    </Controls:AutoCompleteBox>
    <Button Grid.Row="1" Click="Button_Click">Change first person Name</Button>
</Grid>

代码隐藏:

 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;
    }
}

【问题讨论】:

  • 你还没有实现 INotifyPropertyChanged。也许这是问题的根源。我会测试你的代码并说明我的假设是否正确。
  • 无需测试@vorrtex,这是部分原因。另一个问题是使用适当的显示成员。
  • 合适的展示成员是什么意思?
  • @vorrtex- INotifyPropertyChanged 没有帮助。
  • 你也必须改变Text属性,因为这个属性和其他属性是分开的,不观察绑定模型的变化。

标签: wpf binding wpftoolkit


【解决方案1】:

最简单的方法是更改​​ Text 属性:

    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 属性连接。

【讨论】:

  • 感谢@vorrtex,但此代码仅用于在此处显示我的问题。在实际代码中,列表不会在按钮单击事件中更改,而是在 ViewModel 中更改。我的视图中只有 AutoComplteBox。因此,我注意到名称正在更改的范围内。
  • @Erez 您可以将 AutoCompleteBox 的 Text 属性绑定到 ViewModel 的任何属性。我看不到无法解决的问题。如果您编辑您的问题并提供更接近真实代码的代码 - 我会回答。
猜你喜欢
  • 1970-01-01
  • 2011-06-15
  • 2016-06-28
  • 1970-01-01
  • 2020-12-06
  • 2012-08-15
  • 2011-06-01
  • 2017-10-18
  • 1970-01-01
相关资源
最近更新 更多