在运行时的wpf Clear ListBox项目中

时间:2017-06-20 06:29:23

标签: c# wpf xaml listbox textblock

我正在使用wpf listbox,我无法在调用重载数据函数时清除列表,我只想在运行时重新加载新数据,而页面加载则正确加载数据,当我刷新在itemsource中获取新数据我可以看到在调试模式下,但是列表框中没有新数据,旧数据仍然在列表中,我甚至无法清楚,当我调用list.items.clear()时,我尝试了很多方法,是我的XAML绑定有任何问题,以下是我的代码。

XAML:

 <ListBox  ItemsSource="{Binding}"   HorizontalContentAlignment="Left" x:Name="lstbxindex"  Foreground="White" FontSize="20px" Height="400" BorderBrush="#555555" Margin="10,34,16,0" VerticalAlignment="Top" Width="322" Background="#555555" >
            <ListBox.ItemTemplate>    
                <DataTemplate>

                    <WrapPanel Orientation="Horizontal" Margin="5" >

                        <StackPanel Orientation="Horizontal">
                            <TextBlock x:Name="txtblckroundhour" Height="40px" Width="55px" Text="{Binding RoundedHours}"  FontSize="14" Background="#555555" Loaded="txtblckroundhour_Loaded"  Foreground="White"></TextBlock>

                            <Label x:Name="items" MouseDoubleClick="items_MouseDoubleClick" Content="{Binding ProjectRow.Name}" Background="#555555" FontSize="20" Loaded="items_Loaded" Visibility="Visible"  Margin="35,0,0,0"  Width="230" Foreground="White"></Label>
                        </StackPanel>


                        <StackPanel Orientation="Vertical">
                            <ComboBox  Height="40px" Width="290" Margin="-230,0,0,0" Loaded="ComboBox_Loaded" Visibility="Hidden"  IsEditable="True"  FontSize="20"  Background="White"  Foreground="Black"></ComboBox>
                        </StackPanel>

                        <!--<ComboBox  x:Name="ComboBox_AddItem"  Height="40px" Width="290" Margin="-35,35,0,0"  Loaded="ComboBox_AddItem_Loaded"  IsEditable="True"  FontSize="20"  Background="White" Visibility="Hidden" Foreground="Black"></ComboBox>-->
                    </WrapPanel>
                </DataTemplate>



            </ListBox.ItemTemplate>
        </ListBox>

获取值列表

private List<ProjectInformation> projectInformationList1 = new List<ProjectInformation>();

//这里定义了用户界面列表框与内存中对象列表的实际绑定。

 foreach (DtoProjectsRow row in projectsTable.Rows)
                {

                    projectInformationList1.Add(new ProjectInformation(row));
                }

  lstbxindex.DataContext = projectInformationList1;

在SO中我尝试了一些解决方案,但不幸的是它对我不起作用。最后我试过了,

XAML.cs页面

public static readonly DependencyProperty MyListProperty = DependencyProperty.Register("MyList", typeof(ObservableCollection<String>), typeof(Window));

        public ObservableCollection<String> MyList
        {
            get
            {
                return (ObservableCollection<String>)GetValue(MyListProperty);
            }
            set
            {
                SetValue(MyListProperty, value);
            }
        }

XAML:

 <ListBox  ItemsSource="{Binding **ElementName=Window**}"   HorizontalContentAlignment="Left" x:Name="lstbxindex"  Foreground="White" FontSize="20px" Height="400" BorderBrush="#555555" Margin="10,34,16,0" VerticalAlignment="Top" Width="322" Background="#555555" >

使用上面的解决方案列表项是清楚的,但是当列表框清单的页面加载清楚但我不想清除iistboxitems时,在更新用户的值后,它将重新加载列表框中的更新值。

lstbxindex.ItemsSource = null;

但它不起作用。对于页面加载列表框加载所有项目,每隔15分钟它会调用加载函数第一次它将重新加载更新值,但第二次它将重新加载更新的值,之前的值再次保留在列表框中。 / p>

3 个答案:

答案 0 :(得分:0)

我误解了最初认为你在使用MVVM,而不是从后面的代码中填充ListView数据源。

您的第lstbxindex.DataContext = projectInformationList1;行未按照您的想法设置数据。而是尝试lstbxindex.DataContext = this;,这意味着您告诉您的视图在后面的代码中查找数据源。

因此,我建议添加using System.ComponentModel;并使用BindingList,比较为here

private BindingList<ProjectInformation> projectInformationList1 = new BindingList<ProjectInformation>();

你只需要这一次:

foreach (DtoProjectsRow row in projectsTable.Rows)
{
    projectInformationList1.Add(new ProjectInformation(row));
}
lstbxindex.DataSource = projectInformationList1;

正如评论中所提到的,如果你没有像我在你的问题的评论中所建议的那样使用ItemsSource="{Binding projectInformationList1}",那么这是另一种选择:

private ObservableCollection<ProjectInformation> projectInformationList1 = new ObservableCollection<ProjectInformation>();

foreach (DtoProjectsRow row in projectsTable.Rows)
{
    projectInformationList1.Add(new ProjectInformation(row));
}
lstbxindex.DataContext = projectInformationList1;

答案 1 :(得分:0)

你应该有一个带有集合属性的视图模型类,例如像这样:

public class ViewModel
{
    public ObservableCollection<ProjectInformation> Projects { get; }
        = new ObservableCollection<ProjectInformation>();
}

在XAML中设置Window或Page的DataContext,如下所示:

<Window.DataContext>
    <local:ViewModel/>
</Window.DataContext>

并像这样绑定ListBox:

<ListBox ItemsSource="{Binding Projects}">
    ...
</ListBox>

要清除源集合中的所有项目,请在后面的代码中访问DataContext:

var vm = (ViewModel)DataContext;
vm.Projects.Clear();

编辑:除了在XAML中分配DataContext之外,您也可以在后面的代码中执行它,甚至在初始化页面或窗口之前:

public MainWindow()
{
    DataContext = new ViewModel();
    InitializeComponent();
}

答案 2 :(得分:-1)

在loadfunction中添加了一行,最初为ItemSource设置了null,然后将null设置为列表对象

lstbx.ItemsSource=null;
 lstbx.Items.Clear();
  ProjectInfoList1=null;

它将清除listboxitems并仅使用更新的值重新加载。

private BindingList<ProjectInfo> projectInfoList1 = new BindingList<ProjectInfo>();
        Public void loadfunction()
        {

        lstbx.ItemsSource=null;
        lstbx.Items.Clear();
        ProjectInformationList1=null;
        foreach (DtoProRow row in table.Rows)
        {
            projectInfoList1.Add(new ProjectInfo(row));
        }
        lstbx.DataContext = projectInfoList1;
        }