更新MapItemsControl.ItemsSource时,“在使用Items Source之前,项必须为空”

时间:2013-09-02 13:48:23

标签: c# xaml map windows-phone-8

我有一个带有MapsItemControl的Map控件:

<maps:Map x:Name="MyMap">
    <maptk:MapExtensions.Children>
        <maptk:MapItemsControl>
            <maptk:MapItemsControl.ItemTemplate>
                <DataTemplate>
                    . . .
                </DataTemplate>
            </maptk:MapItemsControl.ItemTemplate>
        </maptk:MapItemsControl>
    </maptk:MapExtensions.Children>
</maps:Map>

我按照以下方式在代码中填充MapItemsControl

var itemCollection = MapExtensions.GetChildren((Map)MyMap).OfType<MapItemsControl>().FirstOrDefault();
itemCollection.ItemsSource = myItemCollection;

首次向地图添加项目时,此功能正常。但是,如果我想使用新的soruce项目集合更新它,我会在itemCollection.ItemsSource = myItemCollection;行中收到以下错误:

  

在使用项目来源

之前,项目必须为空

所以,我尝试在代码中添加一行,以便在再次设置源代码之前删除项目,但没有成功:

var itemCollection = MapExtensions.GetChildren((Map)MyMap).OfType<MapItemsControl>().FirstOrDefault();
itemCollection.Items.Clear();
itemCollection.ItemsSource = myItemCollection;

现在我在行itemCollection.Items.Clear();中得到了以下例外:

  

收藏处于不可写模式

如何更新MapItemsControl

中的项目

4 个答案:

答案 0 :(得分:2)

如果你将Items绑定到ItemsSource,似乎物品会被锁定...但是如果你用Item.Add(item)添加每个项目,它就可以了。 所以我最终做的是:

var itemCollection = MapExtensions.GetChildren((Map)MyMap)
                                  .OfType<MapItemsControl>().FirstOrDefault();
if(itemCollection != null && itemCollection.Items.Count >0)
{
    itemCollection.Items.Clear();
}
foreach(var item in YourPushpinCollection)
{
    itemCollection.Items.Add(item);
}

希望这会有所帮助:)

答案 1 :(得分:0)

假设您继续使用相同的myItemCollection来保存当前信息(如果您正在查找源代码,可能就是这种情况),那么您不需要重新绑定。相反,您需要抛出PropertyChanged事件,以便组件知道要使用源的当前内容进行更新。有关详情,请参阅Microsoft的Binding Sources tutorialHow to: Implement Property Change Notification

答案 2 :(得分:0)

尝试使用DataContext属性。而afaik你在使用它时不需要写清楚。试试这个:

var itemCollection = MapExtensions.GetChildren((Map)MyMap).OfType<MapItemsControl>().FirstOrDefault();
itemCollection.DataContext = myItemCollection;

答案 3 :(得分:-1)

Urmm ..怎么样

itemCollection.Items = itemCollection.Items.Clear();