Подтвердить что ты не робот

Windows Phone 8.1 привязка MapTileSource с MVVM

Я пытаюсь привязать DataSource MapTileSource к свойству в моей модели представления, но я получаю сообщение об ошибке REGDB_E_CLASSNOTREG в строке Maps: MapTileSource (подчеркнуто синим является редактором VS). Я всегда мог использовать помощник привязки для достижения такого же эффекта (мне нужно было в версии 8.0 моего приложения), но похоже, что он должен просто работать. Любая идея, что не так?

<Maps:MapControl Style="{Binding Path=MapStyle}" Center="{Binding Path=MapCenter, Mode=TwoWay}" ZoomLevel="{Binding Path=ZoomLevel, Mode=TwoWay}" MapServiceToken="">
    <Maps:MapControl.TileSources>
        <Maps:MapTileSource Layer="BackgroundReplacement" DataSource="{Binding Path=BaseLayerDataSource}" />
    </Maps:MapControl.TileSources>
</Maps:MapControl>

Я также пытался использовать только статический источник данных с таким же эффектом:

<Maps:MapControl Style="{Binding Path=MapStyle}" Center="{Binding Path=MapCenter, Mode=TwoWay}" ZoomLevel="{Binding Path=ZoomLevel, Mode=TwoWay}" MapServiceToken="">
    <Maps:MapControl.TileSources>
        <Maps:MapTileSource Layer="BackgroundReplacement">
            <Maps:MapTileSource.DataSource>
                <Maps:HttpMapTileDataSource UriFormatString="" />
            </Maps:MapTileSource.DataSource>
        </Maps:MapTileSource>
    </Maps:MapControl.TileSources>
</Maps:MapControl>

Изменить: я попробовал образец кода http://msdn.microsoft.com/en-us/library/windows/apps/xaml/dn632728.aspx, и он отлично работает, поэтому кажется очевидным, что сам MapTileSource не зарегистрирован. Но это все codebehind и не использует привязки данных, поэтому для меня это не очень полезно.

Изменить 2: Если я проигнорирую ошибку и попытаюсь развернуть приложение в эмулятор телефона, я получаю это на InitializeComponent() представления:

An exception of type 'Windows.UI.Xaml.Markup.XamlParseException' occurred in HikePoint.exe but was not handled in user code

WinRT information: Cannot deserialize XBF metadata type list as '%1' was not found in namespace '%0'. [Line: 0 Position: 0]

Additional information: The text associated with this error code could not be found.



Cannot deserialize XBF metadata type list as '%1' was not found in namespace '%0'. [Line: 0 Position: 0]

If there is a handler for this exception, the program may be safely continued.
4b9b3361

Ответ 1

В конце концов я сдался и просто сделал поведение, чтобы обработать привязку для меня.

public class TileSourceBehavior : DependencyObject, IBehavior
{
    public DependencyObject AssociatedObject { get; private set; }

    public void Attach(Windows.UI.Xaml.DependencyObject associatedObject)
    {
        var mapControl = associatedObject as MapControl;

        if (mapControl == null)
            throw new ArgumentException("TileSourceBehavior can be attached only to MapControl");

        AssociatedObject = associatedObject;
    }

    public void Detach() { }

    public static readonly DependencyProperty TileSourceProperty =
        DependencyProperty.Register("TileSource", typeof(MapTileSource), typeof(TileSourceBehavior), new PropertyMetadata(null, OnTileSourcePropertyChanged));

    public MapTileSource TileSource
    {
        get { return GetValue(TileSourceProperty) as MapTileSource; }
        set { SetValue(TileSourceProperty, value); }
    }

    private static void OnTileSourcePropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
    {
        var behavior = dependencyObject as TileSourceBehavior;
        var mapControl = behavior.AssociatedObject as MapControl;

        // remove the existing tile source

        var existingTileSource = mapControl.TileSources.FirstOrDefault(t => t.Layer == MapTileLayer.BackgroundReplacement);

        if (existingTileSource != null)
            mapControl.TileSources.Remove(existingTileSource);

        // add the tile source

        behavior.TileSource.Layer = MapTileLayer.BackgroundReplacement;
        mapControl.TileSources.Add(behavior.TileSource);
    }
}

Вы используете его таким образом, где TileSource - свойство MapTileSource в вашей ViewModel.

<Maps:MapControl>
  <i:Interaction.Behaviors>
    <behaviors:TileSourceBehavior TileSource="{Binding Path=TileSource}" />
  </i:Interaction.Behaviors>
</Maps:MapControl>