【问题标题】:How to update ListBox from TextChanged event如何从 TextChanged 事件更新 ListBox
【发布时间】:2014-07-06 13:28:50
【问题描述】:

我有一个文本框,我让用户输入一些文本,然后过滤一个列表框(有点像自动完成)。但是,我不确定在 TextBox 上触发 TextChanged 事件后如何更新 ListBox?

查看

<TextBox Name="textBox" TextChanged="textBox_TextChanged"/>

<ListBox ItemsSource="{Binding NamesList}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding}" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

视图模型

public ObservableCollection<string> NamesList
{
    get
    {
        IEnumerable<string> names = MethodCallToGetStrings();
        return new ObservableCollection<string>(names);
    }
}

public void UpdateNamesList(string _searchTerm)
{
    IEnumerable<string> names = MethodCallToGetStrings()
        .Where(x => x.Name.Contains(_searchTerm))
        .Select(x => x.Name);

    // how to update NamesList from here?
}

文本框事件

private void textBox_TextChanged(object sender, TextChangedEventArgs e)
{
    TextBox textBox = sender as TextBox;
    m_viewModel.UpdateNamesList(textBox.Text);
}

【问题讨论】:

  • 由于类型不同,无法为 NamesList 分配名称,也尝试创建新的 ObservableCollection。
  • 为什么每次得到NamesList都要创建一个新的ObservableCollection?另外,你的二传手在哪里?
  • @RodrigoSilva 是的,这可能是我出错的地方。 public ObservableCollection&lt;string&gt; NamesList { get; set; } 现在可以使用了。

标签: c# wpf


【解决方案1】:
public void UpdateNamesList(string _searchTerm)
{
    IEnumerable<string> names = MethodCallToGetStrings()
        .Where(x => x.Name.Contains(_searchTerm))
        .Select(x => x.Name);

    NamesList.Clear();
    foreach(name in names) 
    {
       NamesList.Add(name);
    }
}

【讨论】:

  • 我想选择完整的 x 而不是它的属性,而不是我们将如何纠正代码。
猜你喜欢
  • 2012-07-16
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-06
  • 2013-07-06
相关资源
最近更新 更多