我正在使用带有ItemTemplate的ListBox控件,如下所示:
<ListBox Name="lbItemsList" ItemsSource="{Binding}" >
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding ID}" Padding="5,0,0,0" />
<TextBlock Text=" - " Padding="5,0,0,0" />
<TextBlock Text="{Binding Description}" Padding="5,0,0,0" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
然后,在代码中我动态地将一个集合绑定到ListBox,如下所示:
lbItemssList.ItemsSource = _itemsList.Values;
但有时我需要将不同的或修改过的项目列表重新绑定到ListBox。当我这样做时,ListBox不会使用新列表更新,似乎绑定无法正常工作,除非我这样做:
lbItemssList.ItemsSource = null;
lbItemssList.ItemsSource = _itemsList.Values;
我和其他ListBox控件做了同样的事情,没有遇到这个问题。我在这里缺少什么?
答案 0 :(得分:1)
首先,这里没有“绑定”,您只需将一个集合分配给ItemsSource
属性。
ItemsSource
属性会将分配给它的值与当前值进行比较,如果值相同则不会执行任何操作。
我的猜测是你的Values
属性不是ObservableCollection
(在这种情况下,ListBox会跟踪集合更改而无需任何操作)。此外,虽然您可能更改了Values
集合的内容,但它仍然是最初分配给ItemsSource
的集合的同一个实例。
答案 1 :(得分:0)
我已经厌倦了在我身边并且工作正常。 我的代码
public MainPage()
{
InitializeComponent();
BindData();
}
private void BindData()
{
List<MyClass> listClass = new List<MyClass>();
for (int i = 0; i < 20; i++)
{
MyClass aMyClass = new MyClass();
aMyClass.Description = "Description " + i.ToString();
aMyClass.ID = i;
listClass.Add(aMyClass);
}
lbItemsList.ItemsSource = listClass;
}
private void buttonaa_Click(object sender, RoutedEventArgs e)
{
List<MyClass> listClass = new List<MyClass>();
for (int i = 20; i < 40; i++)
{
MyClass aMyClass = new MyClass();
aMyClass.Description = "Description " + i.ToString();
aMyClass.ID = i;
listClass.Add(aMyClass);
}
lbItemsList.ItemsSource = null;
lbItemsList.ItemsSource = listClass;
}
<ListBox Name="lbItemsList" ItemsSource="{Binding}" >
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding ID}" Padding="5,0,0,0" />
<TextBlock Text="{Binding Description}" Padding="5,0,0,0" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
请检查您是否正在根据数据库记录相同的内容并且您认为列表没有刷新