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.
Ответы
Ответ 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>
Ответ 2
Что ваша целевая платформа проекта? Попробуйте изменить его на x64.
Подобный вопрос на SO