Связывание элемента управления WP7 Maps с ViewModel, проблема с MapMode - PullRequest
0 голосов
/ 02 декабря 2010

Я пытаюсь воспроизвести образец BingMaps обучающего набора для Windows Phone 7: http://msdn.microsoft.com/en-us/wp7trainingcourse_usingbingmapslab_topic2.aspx#_Toc271039352

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

Всеработает нормально, за исключением того, что привязка к свойству Mode (антенна или дорога) вызывает XamlParseException.Есть ли проблема, потому что это не простое свойство?

Это оригинальный Xaml:

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

. Map.Mode может быть изменен из codebehind.

Вместо этого я пытаюсь сделать следующее:

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

и важная часть модели представления:

    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);
        }
    }

Спасибо за вашу помощь!

Ответы [ 2 ]

3 голосов
/ 02 декабря 2010

решаемая.

«Режим» не является свойством зависимости. Так что это не может быть связано.

Мой обходной путь:

  • добавлено свойство зависимости для просмотра (= Page)
  • свойство привязанной зависимости к свойству в viewmodel (через код в конструкторе)
  • Установить режим управления картой в обработчике обратного вызова в свойстве

    //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;
    }
    

Надеюсь, этот поможет другим!

0 голосов
/ 02 декабря 2010

Я подозреваю, что вам понадобится конвертер с вашей привязкой.

...