Hai我正在使用wpf列表框,我无法在调用重载数据函数时清除列表,我只想在运行时重新加载新数据,而页面加载它正确加载数据,当我刷新新数据时在itemsource中获取我可以看到在调试模式,但列表框中没有新数据,旧数据仍然在列表中,我甚至无法清除,当我调用list.items.clear()时,它会抛出异常和应用程序崩溃,我尝试了很多方法,在我的XAML绑定中有任何问题,以下是我的代码。
<DataTemplate x:Key="listBoxTemplate">
<StackPanel Margin="3">
<DockPanel >
<TextBlock FontWeight="Bold" Text="{Binding Name}" DockPanel.Dock="Left" Margin="5,0,10,0"/>
<TextBlock Text=" " />
<TextBlock Text="{Binding Percnt}" Foreground="Green" FontWeight="Bold" />
</DockPanel>
</StackPanel>
</DataTemplate>
我的列表框
<ListBox Height="898" Name="lstEntity" Width="291" ItemTemplate="{StaticResource listBoxTemplate}" SelectionChanged="lstEntity_SelectionChanged"/>
绑定代码
lstEntity.ItemsSource = sei.getNames();
getNames()函数只返回数据作为列表,没有特殊的代码,如何解决这个问题。
答案 0 :(得分:4)
获得此类行为的最佳方法是使用DependencyProperty和绑定。
在您的班级文件中,像这样创建DP:
#region MyList dependency property
public static readonly DependencyProperty MyListProperty = DependencyProperty.Register("MyList", typeof(ObservableCollection<String>), typeof(Window1));
public ObservableCollection<String> MyList
{
get { return (ObservableCollection<String>) GetValue(MyListProperty); }
set { SetValue(MyListProperty, value); }
}
#endregion
然后在你的XAML中绑定到那个DP:
<ListBox ItemSource={Binding Path=MyList, ElementName=MyWindow} Height="898" Name="lstEntity" Width="291" ItemTemplate="{StaticResource listBoxTemplate}" SelectionChanged="lstEntity_SelectionChanged"/>
其中“MyWindow”是x:XAML文件中根窗口的名称(你当然也可以使用像MVVM模式那样的datacontext:)
然后,如果您想在代码中添加/删除项目,只需直接访问该列表:
MyList.Clear();
MyList.Add("My New String");
当然,您还需要将集合的通用类型更改为您自己的类...
答案 1 :(得分:1)
您是否(通过直接添加到Items集合或仅通过ItemsSource填充ListBox?
如果是后者,请将ItemsSource设置为null并将其重新设置为重新加载。
答案 2 :(得分:1)
在您提供例外和其他详细信息之前,不能说明您的问题的原因是什么。但是建议做更好的方法。
getnames
方法返回IEnumerable。 现在您可以更改ObservableCollection以查看ListBox中的更改。
答案 3 :(得分:1)
在此之前:
lstEntity.ItemsSource = sei.getNames();
清除列表框itemssource:
lstEntity.ItemsSource = "";
答案 4 :(得分:0)
如果您正在使用MVVM模式,请向ViewModel添加属性:
public IEnumerable Names {
get { return sei.getNames() as IEnumerable; }
}
然后,在您的XAML中,将ItemsSource编码为:
<ListBox ... ItemsSource="{Binding Names}" ... />
每当Names列表的内容发生变化时,都会引发PropertyChanged事件;这将告诉WPF系统刷新ListBox:
PropertyChanged(this, new PropertyChangedEventArgs("Names");