动态更新数据绑定列表框C#WPF

本文关键字:C#WPF 列表 数据绑定 更新 动态 | 更新日期: 2023-09-27 18:00:18

所以尽管我在网上找到了文章,但我仍然无法理解这一点。

我有一个列表框

<ListBox HorizontalAlignment="Left" Margin="54,35,0,0" Name="resultsbox" VerticalAlignment="Top" Width="382" Visibility="Collapsed">
    <DataTemplate>
        <StackPanel>
            <TextBlock Text="{Binding nameElement}"/>
        </StackPanel>
    </DataTemplate>
</ListBox>

这是的数据绑定

   ObservableCollection<string> results = new ObservableCollection<string>();

并使用进行更新

   private void searchbox_TextChanged(object sender, TextChangedEventArgs e)
    {
    resultsbox.Visibility = Visibility.Visible;
    resultsbox.ItemsSource = results;

    if (results.Count == 0)
    {
        foreach (ele item in eles)
        {
            if (!results.Contains(item.nameElement))
            {
                results.Add(item.nameElement);
            }
        }
    }
    else
    {
        resultsbox.Items.Clear();
    }
    if (searchbox.Text.Equals(""))
    {
        window1.Height = 47;
        resultsbox.Visibility = Visibility.Collapsed;
    }

    if (resultsbox.Items.Count == 0)
    {
        resultsbox.Visibility = Visibility.Collapsed;
        window1.Height = 47;
    }
    else{
        window1.Height = 47 + (22 * resultsbox.Items.Count);
    }
  }

它加载所有数据,但不会更新!

如果我做resultsbox.clear(),它会说你不能清除绑定项目。如果你试图清除来源,它不会起任何作用。如果您尝试将resultsbox项源设置为null并清除源,然后重新绑定它,则不执行任何操作。如果您尝试将列表框绑定到一个空源,它将不会起任何作用。。。。

动态更新数据绑定列表框C#WPF

答案是从更改更新中的foreach循环

 resultsbox.ItemsSource = results;
    if (results.Count == 0)
    {
        foreach (ele item in eles)
        {
            if (!results.Contains(item.nameElement))
            {
                results.Add(item.nameElement);
            }
        }
    }

results.Clear();
    foreach (ele item in eles)
    {
        if (item.nameElement.ToLower().Contains(searchbox.Text.ToLower()))
        {
            results.Add(item.nameElement);
        }
    }
resultsbox.ItemsSource = results;

您可以尝试使用双向模式绑定来实现您的要求IMO、

<ListBox HorizontalAlignment="Left" Margin="54,35,0,0" Name="resultsbox" VerticalAlignment="Top" Width="382" Visibility="Collapsed">
<DataTemplate>
    <StackPanel>
        <TextBlock Text="{Binding nameElement, Mode=TwoWay}"/>
    </StackPanel>
</DataTemplate>