将WP7 Maps控件绑定到ViewModel,MapMode问题

时间:2010-12-01 23:35:16

标签: silverlight mvvm windows-phone-7 mvvm-light

我正在尝试重现Windows Phone 7培训套件的BingMaps示例: http://msdn.microsoft.com/en-us/wp7trainingcourse_usingbingmapslab_topic2.aspx#_Toc271039352

但不是在代码隐藏中连接所有内容我想使用viewmodel。

一切正常,但绑定到Mode属性(天线或道路)会导致XamlParseException。 是否存在问题,因为它不是一个简单的属性?

这是原始的Xaml:

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

可以从代码隐藏更改Map.Mode。

相反,我正在尝试以下方法:

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

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

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

解决。

“模式”不是依赖属性。所以它不能受约束。

我的解决方法:

  • 将依赖属性添加到view(= Page)
  • 将依赖属性绑定到viewmodel中的属性(通过构造函数中的代码)
  • 在propertyChanged回调处理程序中设置Map控件的模式

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

希望这个会帮助别人!

答案 1 :(得分:0)

我怀疑你需要使用绑定的converter

相关问题