4

基本的に、私の質問はすでにタイトルに表示されています:次のようなメインウィンドウがある場合:

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

My Window 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にバインドしたいと思います。どうすればこれを達成できますか?

よろしく、Ialokim

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 インターフェースを実装する必要があります (どこにでも 100 万の例がありますが、ここで説明する必要はありません)。

次に、次のように、マップの ZoomLevel プロパティを MapZoom プロパティにバインドします。

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

これが機能するには、ウィンドウの DataContext がウィンドウ自体である必要があります。ウィンドウのコンストラクターに 1 行が必要です。

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

2 番目のウィンドウがメイン ウィンドウを呼び出す方法が必要なので、メイン ウィンドウで現在のインスタンスを返す静的プロパティを作成できます。

    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 ができました。

したがって、2 番目の Window で、メイン Window のそのインスタンスを指すプロパティを作成します。

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

最後に、2 番目のマップのズームを、Main のメンバーであるパブリック プロパティ MapZoom にバインドできます。

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

このバインディングでは、「Main」は、window2 の public プロパティ (this.DataContext = this; を window2 にも設定) を介して MainWindow インスタンスを参照し、.MapZoom プロパティにアクセスしています。

既定では、XAML で作成するすべてのオブジェクトはプライベートであるため、外部からアクセスできるようにするには、get/set アクセサーを使用してパブリック プロパティで明示的に公開する必要があります。

これが機能するかどうか教えてください。コードをテストするアプリを作成していません。よろしく!

于 2013-01-27T18:09:21.080 に答える