我的xaml ......
<ListBox Margin="6,35,6,6" Name="lbLayers" SelectionMode="Extended" >
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding Key,Mode=TwoWay}" />
<TextBlock Text="{Binding Value.Visible,Mode=TwoWay,StringFormat='Visible: {0}'}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
..我的代码是......
void GameEvents_MapCreated(object sender, Zider.EventArgs.MapEventArgs e)
{
HookMapLayerEvents(false);
this.map = e.Map;
HookMapLayerEvents(true);
this.lbLayers.ItemsSource = this.map.Layers;
}
this.map.layers是类型的通用字典(字符串,MapLayer(Tile))
当我在列表框中设置ItemSource时,字典中没有要开始的项目。当我单击一个按钮时,我将地图图层添加到
this.map.Layers.Add("key", new MapLayer<Tile>());
MapLayer也为它的属性实现了INotifyPropertyChanged。
对于我的生活,我似乎无法将项目显示在列表框中。
答案 0 :(得分:2)
问题是map.Layers
的值不会改变,Dictionary<TKey, TValue>
实现INotifyCollectionChanged
接口。因此,ListBox
无法知道任何新项目可供展示。
如果可能,请尝试更改Layers
属性,以便它显示ObservableCollection<T>
。
当然,如果你必须有一本字典,那可能会有问题。如果您只想确保唯一条目,则可以使用HastSet
密钥来管理它。如果你需要密钥来查找,那么如果项目很少,顺序搜索应该做得相当好。
完整的解决方案可能是实现同时具有ObservableDictionary
和IDictionary<TKey, TValue>
接口的INotifyCollectionChanged
。有一些关于如果你搜索“ObservableDictionary Silverlight”,只要小心他们实际上实现了正确的接口,如果它的“可观察”但不是与ItemsSource
兼容的那么不好。