11

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

<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> 

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

Edit 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. 
+0

Я полагаю, вы не нашли решения для этого? –

+0

Нет, вместо этого я использовал привязку привязки, потому что мне это не нужно в двух направлениях. Я могу опубликовать код, если вы захотите, когда я вернусь домой. –

+2

Буду рад видеть, как вы обошли эту ошибку. Я получаю ту же ошибку, пытающуюся связать источник MediaCapture с CaptureElement. –

ответ

0

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

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> 
0

Что ваша целевая платформа проекта? Попробуйте изменить его на x64.

Similar Question on SO

+0

Это приложение для Windows-телефона; x64 не является допустимой целью сборки. –

+0

да простите, я попробую это после работы –