【问题标题】:How to set multiple pushpins from code-behind (WP8)?如何从代码隐藏(WP8)设置多个图钉?
【发布时间】:2014-03-30 02:33:35
【问题描述】:

我尝试添加多个图钉来映射。

这是 XAML:

<maps:Map ZoomLevel="8" Height="500" x:Name="map1" Width="415" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0,0,0,0">
                <toolkit1:MapExtensions.Children>
                    <toolkit1:MapItemsControl x:Name="PushpinCollection">
                        <toolkit1:MapItemsControl.ItemTemplate>
                            <DataTemplate>
                                <toolkit1:Pushpin GeoCoordinate="{Binding Coords}" Content="{Binding Name}"/>
                            </DataTemplate>
                        </toolkit1:MapItemsControl.ItemTemplate>
                    </toolkit1:MapItemsControl>
                </toolkit1:MapExtensions.Children>
            </maps:Map>

代码如下:

protected override async void OnNavigatedTo(NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);
        var xmlDataSource = new XmlDataSource();
        var sigCol = new SignalCollection(xmlDataSource);
        var allSignals = await sigCol.GetData(false, false, "UA");
        ObservableCollection<IssueDescription> signalsWithCoords = new ObservableCollection<IssueDescription>();
        foreach (var signal in allSignals)
        {
            if (signal.Coords != null)
            {
                signalsWithCoords.Add(signal);                    
            }
        }
        PushpinCollection.ItemsSource = signalsWithCoords;
    }

但是最后一个字符串抛出 NullReferenceException。怎么了?

【问题讨论】:

  • 您是否尝试过调试并查看异常究竟是在哪里引发的以及您的变量的内容是什么?
  • @Romasz,你能告诉我我应该怎么做才能找到引发异常的地方吗?顺便说一句,signalsWithCoords 变量不为空,它包含 193 个元素。
  • 我发现 PushpinCollection 为空,它抛出异常。但是为什么会这样呢? PushpinCollection 是 XAML 中 MapItemsControl 的 x:Name。

标签: c# xaml windows-phone-8


【解决方案1】:

正如我检查过的 PushpinCollection 存在(不为空)并且以下代码应该可以工作:

protected override async void OnNavigatedTo(NavigationEventArgs e)
{
    base.OnNavigatedTo(e);
    var xmlDataSource = new XmlDataSource();
    var sigCol = new SignalCollection(xmlDataSource);
    var allSignals = await sigCol.GetData(false, false, "UA");
    ObservableCollection<IssueDescription> signalsWithCoords = new ObservableCollection<IssueDescription>();
    foreach (var signal in allSignals)
    {
        if (signal.Coords != null)
        {
            signalsWithCoords.Add(signal);                    
        }
    }
    MapItemsControl PushpinCol = MapExtensions.GetChildren(map1).FirstOrDefault(x => x is MapItemsControl) as MapItemsControl;

    PushpinCol.ItemsSource = signalsWithCoords;
}

进一步挖掘发现这似乎是一个小错误。在源代码中DependencyProperty NameProperty 注册为"ItemTemplate" - 这可能会阻止从代码中通过名称获取它。

编辑 - 在 cmets 之后

在源代码中挖掘更多信息会发现当Items.Count &gt; 0 并且您尝试更改 ItemsSource 时 MapExtension 会引发此异常。这是一种允许您更改 ItemsSource 的方法:

protected override async void OnNavigatedTo(NavigationEventArgs e)
{
    base.OnNavigatedTo(e);
    var xmlDataSource = new XmlDataSource();
    var sigCol = new SignalCollection(xmlDataSource);
    var allSignals = await sigCol.GetData(false, false, "UA");
    ObservableCollection<IssueDescription> signalsWithCoords = new ObservableCollection<IssueDescription>();
    foreach (var signal in allSignals)
    {
        if (signal.Coords != null)
        {
            signalsWithCoords.Add(signal);                    
        }
    }
    MapItemsControl PushpinCol = MapExtensions.GetChildren(map1).FirstOrDefault(x => x is MapItemsControl) as MapItemsControl;
    if (PushpinCol != null && PushpinCol.ItemsSource != null)
    {
        (PushpinCol.ItemsSource as IList).Clear();
        PushpinCol.ItemsSource = null;
    }
    PushpinCol.ItemsSource = signalsWithCoords;
}

另一方面,考虑将您的 Collection 设为静态并将其设置为 ItemsSource 一次。

【讨论】:

  • 顺便说一句,如何提取与图钉绑定的对象?我使用 MouseLeftButtonUp 事件,但无法将发送者对象转换为 IssueDescription。
  • @splash27 你试过了吗:((sender as Pushpin).DataContext as IssueDescription)?
  • 还有一个错误。当我尝试重新加载页面时,它在最后一行崩溃并出现异常 InvalidOperation:使用 ItemsSource 之前项目必须为空。我不能使用 Items.Clear() 方法,因为 Items 是不可写的属性。有办法解决吗?
  • @splash27 如果您搜索该异常,则几乎没有答案-它们​​可能会有所帮助。每次导航到页面时都需要创建 ObservableCollection 吗?仅在为 null 时设置 ItemsSource?
  • 如果我使用后退按钮返回此页面,则会出现异常。那个时候的signalsWithCoors集合可能是另一个集合,我需要将这个刷新的signalsWithCoords集合设置为ItemsSource,但我不能,因为PushpinCol已经有项目,当我第一次访问这个页面时,它已经被缓存了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
相关资源
最近更新 更多