我正在使用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>
答案 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;
}