2010-12-01 7 views
0

Je suis en train de reproduire l'échantillon BingMaps de Windows Phone 7 trainingkit: http://msdn.microsoft.com/en-us/wp7trainingcourse_usingbingmapslab_topic2.aspx#_Toc271039352Reliure WP7 contrôle Maps pour ViewModel, un problème MapMode

mais au lieu de câblage tout en codebehind je voudrais utiliser un viewmodel.

Tout fonctionne correctement, sauf que la liaison à la propriété Mode (aérienne ou routière) provoque une exception XamlParseException. Y at-il un problème parce que ce n'est pas une simple propriété?

Ceci est le XAML d'origine:

  <my:Map Name="Map" 
        CredentialsProvider="{Binding CredentialsProvider}"> 
       <my:Map.Mode> 
        <my:AerialMode ShouldDisplayLabels="True" /> 
       </my:Map.Mode> 
      </my:Map> 

Le Map.Mode peut être changé de codebehind.

Au lieu de cela, je suis en train de ce qui suit:

 <my:Map x:Name="Map" 
       CredentialsProvider="{Binding CredentialsProvider}" 
       ZoomLevel="{Binding Zoom, Mode=TwoWay}" 
       Center="{Binding Center, Mode=TwoWay}" 
       Mode="{Binding MapMode}" /> 

et la partie importante de la viewmodel:

private MapMode _mapMode = new AerialMode(true); 
    public MapMode MapMode 
    { 
     get { return _mapMode; } 
     set 
     { 
      _mapMode = value; 
      RaisePropertyChanged("MapMode"); 
     } 
    } 

    private void ChangeMapMode() 
    { 
     if (MapMode is AerialMode) 
     { 
      MapMode = new RoadMode(); 
     } 
     else 
     { 
      MapMode = new AerialMode(true); 
     } 
    } 

Merci pour votre aide!

Répondre

3

Résolu.

"Mode" n'est pas une propriété de dépendance. Donc, ça ne peut pas être lié.

Ma solution:

  • propriété de dépendance ajoutée à voir (= page)
  • propriété de dépendance liée à la propriété en viewmodel (via le code dans le constructeur)
  • mode Jeu de contrôle de la carte dans la gestionnaire de rappel PropertyChanged

    //Constructor 
    public MainPage() 
    { 
        InitializeComponent(); 
        DataContext = new MainViewModel(); 
        Binding b = new Binding("MapMode"); 
        this.SetBinding(MapModeProperty, b); 
    } 
    
    
    //DependencyProperty. No need for corresponding CLR-property. 
    public static readonly DependencyProperty MapModeProperty = 
        DependencyProperty.Register("MapMode", typeof(MapMode), typeof(MainPage), 
        new PropertyMetadata(OnMapModeChanged)); 
    
    
    //Callback 
    private static void OnMapModeChanged(DependencyObject element, 
         DependencyPropertyChangedEventArgs e) 
    { 
        ((MainPage)element).Map.Mode = e.NewValue as MapMode; 
    } 
    

J'espère que celui-ci aidera les autres!

0

Je suppose que vous aurez besoin d'utiliser un converter avec votre liaison.

+0

non. le convertisseur n'aide pas –

Questions connexes