4

基本上,我的问题已经出现在标题中:当我有如下 MainWindow 时:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:easycache"
        xmlns:map="clr-namespace:MapControl;assembly=MapControl.WPF"
        x:Class="easycache.MainWindow"
        x:Name="MainWindow1"
        Title="easycache"
        Height="600"
        Width="850">
  <map:Map Grid.Column="2"
           Grid.Row="1"
           Name="map"
           IsManipulationEnabled="True"
           LightForeground="Black"
           LightBackground="White"
           DarkForeground="White"
           DarkBackground="#FF3F3F3F"
           Center="0.0,0.0"
           ZoomLevel="0.0"
           TileLayer="{Binding Source={StaticResource TileLayersView}, Path=CurrentItem}" />

在我的窗口 2 中,我有:

<map:Map Name="map" IsManipulationEnabled="False"
                 LightForeground="Black" LightBackground="White" DarkForeground="White" DarkBackground="#FF3F3F3F"
                 Center="0.0,0.0" ZoomLevel="{Binding ?????}">

我想将 Window2 中地图的 ZoomLevel 绑定到我的 MainWindow 中地图的 ZoomLevel。我怎样才能做到这一点?

问候, 亚洛金

4

1 回答 1

0

在您的 MainWindow 代码隐藏中,使用公共 get 访问器创建公共属性,如下所示:

private double _mapZoom;
public double MapZoom //I assume that ZoomLevel is of type double, if not use the correct type
{
    get { return _mapZoom; }
    set { _mapZoom = value; OnPropertyChanged("MapZoom"); }
}

你必须在你的 MainWindow 中实现 INotifyPropertyChanged 接口(到处都有一百万个例子,这里不需要讨论)。

然后,将地图的 ZoomLevel 属性绑定到 MapZoom 属性,如下所示:

<map:Map Name="map" ZoomLevel="{Binding RelativeSource={RelativeSource Self}, Path=MapZoom}, Mode=TwoWay"/>

为此,Window 的 DataContext 必须是 Window 本身,在 Window 的构造函数中需要一行:

    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this; //add this line
    }

您需要一种方法让第二个窗口调用主窗口,因此您可以创建一个静态属性来返回主窗口中的当前实例:

    private static MainWindow _instance;
    public static MainWindow Instance
    {
        get
        {
            if (_instance == null)
                _instance = new MainWindow();
            else
                _instance = this;

            return _instance;
        }
    } //you have to make sure to create ONE instance of MainWindow before getting this property, and not to create more instances elsewhere

现在您将让 MainWindow 公开一个公共属性,该属性绑定到地图的缩放。

因此,在您的第二个窗口中创建一个指向该主窗口实例的属性:

   public MainWindow Main { get { return MainWindow.Instance; }

最后,您可以将第二张地图的缩放绑定到作为 Main 成员的公共属性 MapZoom:

<map:Map Name="map2" ZoomLevel="{{Binding RelativeSource={RelativeSource Self}, Path=Main.MapZoom}, Mode=TwoWay"}">

在此绑定中,“Main”是通过 window2 的公共属性(在 window2 中也设置 this.DataContext = this;)引用 MainWindow 实例,并访问 .MapZoom 属性。

默认情况下,您在 XAML 中创建的所有对象都是私有的,因此您必须使用带有 get/set 访问器的公共属性显式公开它们,以使它们可以从外部访问。

让我知道这是否有效,我没有创建应用程序来测试代码。问候!

于 2013-01-27T18:09:21.080 回答