4

我查看了类似的错误,但找不到与我的场景匹配的错误。

我正在使用这里的示例: http ://wp.qmatteoq.com/maps-in-windows-phone-8-and-phone-toolkit-a-winning-team-part-2/

经常,但不是每次..我收到以下异常:

An exception of type 'System.InvalidOperationException' occurred in Microsoft.Phone.Controls.Toolkit.DLL but was not handled in user code

Items collection must be empty before using ItemsSource.

堆栈跟踪:

   at Microsoft.Phone.Maps.Toolkit.MapItemsControl.OnItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
 at System.Windows.DependencyObject.RaisePropertyChangeNotifications(DependencyProperty dp, Object oldValue, Object newValue)
 at System.Windows.DependencyObject.UpdateEffectiveValue(DependencyProperty property, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, ValueOperation operation)
 at System.Windows.DependencyObject.SetValueInternal(DependencyProperty dp, Object value, Boolean allowReadOnlySet)
 at System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value)
 at Microsoft.Phone.Maps.Toolkit.MapItemsControl.set_ItemsSource(IEnumerable value)
 at NextBuses.MainPage.GetMembersCompleted(Object sender, GetMembersCompletedEventArgs e)
 at NextBuses.SQLService.Service1Client.OnGetMembersCompleted(Object state)

我正在做的是在 Windows Phone 8 中填充地图。当它工作时,它很好。我的列表中有 25 项作为图钉添加到列表中。

XAML:

<my:Map Height="696" MouseLeftButtonDown="Close_popup" HorizontalAlignment="Left" Name="map1" VerticalAlignment="Top" Width="480" Grid.RowSpan="2" ZoomLevel="5.5"  >
             <toolkit:MapExtensions.Children>
                <toolkit:UserLocationMarker x:Name="UserLocationMarker" Visibility="Visible" />
                <toolkit:MapItemsControl >
                    <toolkit:MapItemsControl.ItemTemplate>
                        <DataTemplate>
                            <toolkit:Pushpin  MouseLeftButtonUp="pin_click" GeoCoordinate="{Binding Location1}"  Template="{StaticResource PushpinControlTemplate1}"/>
                        </DataTemplate>
                    </toolkit:MapItemsControl.ItemTemplate>
                </toolkit:MapItemsControl>
            </toolkit:MapExtensions.Children>
        </my:Map>

C#

 ObservableCollection<DependencyObject> children = MapExtensions.GetChildren(map1);
        var obj = children.FirstOrDefault(x => x.GetType() == typeof(MapItemsControl)) as MapItemsControl;
        obj.ItemsSource = details;

'details' 是一个列表,其中包含地理坐标等变量。

4

4 回答 4

2

设置 ItemsSource 的那一刻,Items 变为只读。您必须选择要使用的那个。你不能在这里混搭。所以在设置 ItemsSource 之前,调用 Items.Clear()

于 2013-01-25T16:30:37.533 回答
1

AFAIK 你不能有数据绑定的项目,也不能为同一个 ItemsControl 硬编码项目。这意味着只要您使用 DataBinding,硬编码的 UserLocationMarker 就不会在那里工作。

于 2013-01-25T19:16:47.167 回答
1

我一直在寻找解决这个问题的方法,当我检查了 Extension 的源代码时,发现当 ItemsSource 发生变化时,有一个 if 语句检查 Items.Count > 0 并抛出异常。

因此,要将新 Collection 设置为 ItemsSource,您可以使用这样的代码:

MapItemsControl MIC = MapExtensions.GetChildren(map1).FirstOrDefault(x => x is MapItemsControl) as MapItemsControl;
if (MIC != null && MIC.ItemsSource != null)
{
   (MIC.ItemsSource as IList).Clear() // clear old collection
   MIC.ItemsSource = null;
}
MIC.ItemsSource = details; // new collection
于 2014-03-29T18:32:42.677 回答
0

我在清除 ItemsSource 列表时遇到问题。我的解决方案是在 Items 上使用 Clear 但不要忘记设置 ItemsSource = null 因为这会触发它。然后您可以为 ItemsSource 设置一个新值。当然,这必须在 Dispatcher 块中完成,因为它在 UI 线程上运行。

于 2013-03-15T11:36:20.117 回答