XAML data.binding - 如何将my方法中的属性绑定到视图中的经度/纬度?

时间:2014-11-17 21:57:07

标签: c# xaml

我正在使用GeoLocator找出我的位置。这是方法:

private async void GetCurrentLocation()
{
    Geolocator locationFinder = new Geolocator
    {
        DesiredAccuracyInMeters = 50,
        DesiredAccuracy = PositionAccuracy.Default
    };

    try
    {
        Geoposition currentLocation = await  locationFinder.GetGeopositionAsync(
            maximumAge: TimeSpan.FromSeconds(120),
            timeout: TimeSpan.FromSeconds(10));
        String longitude = currentLocation.Coordinate.Longitude.ToString("0.00");
        String latitude = currentLocation.Coordinate.Latitude.ToString("0.00");
        MyTextBlock.Text = "Long: " + longitude + "Lat: " + latitude;
    }
    catch (UnauthorizedAccessException)
    {
        MyTextBlock.Text = "some message";
    }
}

现在,我是我的观点我有这个代码(这里有硬编码的值,我想用上面的方法替换经度/纬度)。

<bm:Map ZoomLevel="7.5" Credentials="my key" x:Name="myMap">
    <bm:Map.Center>
        <bm:Location Latitude="48" Longitude="-122.580489" />
    </bm:Map.Center>
</bm:Map>

我对这种开发很新,并且想知道如何将方法中的属性绑定到我视图中的long / lat。谢谢!

1 个答案:

答案 0 :(得分:2)

这需要某种对象(通常称为ViewModel),Map控件将从中获取DataContext。 (DataContext向下移动可视树,从父级到子级,除非在任何子控件上显式设置。)ViewModel公开您希望视图(您的Window /其他可见控件)的信息,以便以某种方式直观地表示给用户。

请注意,WPF MVVM样式中ViewModels的一个关键组件是它实现了INotifyPropertyChanged。此接口允许对象向UI发信号通知以上述方式绑定的值已更改,并且应更新UI以反映该值。

这是一个非常简单的ViewModel实现,用于您的目的:

// uses System.ComponentModel
public class YourViewModel : INotifyPropertyChanged
{
    private double longitude;
    public double Longitude
    { 
        get { return longitude; }
        set
        {
            longitude = value;
            NotifyPropertyChanged("Longitude");
        }
    } 

    private double latitude;
    public double Latitude
    { 
        get { return latitude; }
        set
        {
            latitude = value;
            NotifyPropertyChanged("Latitude");
        }
    } 

    public event PropertyChangedEventHandler PropertyChanged;
    protected void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

这会公开一个Longitude属性和一个Latitude属性,您可以将其用于XAML中的绑定。如果您打算使用真正的MVVM,那么这些属性可能应该包含在模型对象中,而ViewModel应该将一组模型对象公开给View。就目前而言,这基本上是一个尽可能简单的例子。

通常,您只需使用一个简单的绑定将控件的属性连接到ViewModel的属性,如下所示:

<TextBlock Text="{Binding Longitude}" />

其中TextBlock的DataContext已设置为YourViewModel的实例。

但是,看起来Bing Map对象不是FrameworkElement,因此它没有DataContext属性,并且绑定稍微复杂一些,因为它需要StaticResource s。我真的没有能力测试Bing地图API,但是binding to non-FrameworkElements上的这个链接应该会有所帮助。