silverlight 4 {binding}通用字典到列表框(未显示的项目)

时间:2011-05-13 20:27:43

标签: silverlight binding listbox

我的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。

对于我的生活,我似乎无法将项目显示在列表框中。

1 个答案:

答案 0 :(得分:2)

问题是map.Layers的值不会改变,Dictionary<TKey, TValue>实现INotifyCollectionChanged接口。因此,ListBox无法知道任何新项目可供展示。

如果可能,请尝试更改Layers属性,以便它显示ObservableCollection<T>

当然,如果你必须有一本字典,那可能会有问题。如果您只想确保唯一条目,则可以使用HastSet密钥来管理它。如果你需要密钥来查找,那么如果项目很少,顺序搜索应该做得相当好。

完整的解决方案可能是实现同时具有ObservableDictionaryIDictionary<TKey, TValue>接口的INotifyCollectionChanged。有一些关于如果你搜索“ObservableDictionary Silverlight”,只要小心他们实际上实现了正确的接口,如果它的“可观察”但不是与ItemsSource兼容的那么不好。