0

私はWPFとC#を初めて使用します。別のクラスのコントロールまたはオブジェクト(テキストボックス、ボタンなど)にアクセスするための最良の方法は何ですか。以下に私の状況を説明します。これが違いを生むのであれば、私もMEFを使用しています。どんな助けでもいただければ幸いです。ありがとうございました。

EsriMapView.xamlは、すべてのオブジェクトが含まれている場所です。このためのクラスはEsriMapView.xaml.csです。

EsriMapViewModel.csは、私がEsriMapView.xamlにアクセスしようとしているもう1つのクラスです。すべてのオブジェクトで私が受け取るエラーは、「名前の空白は現在のコンテキストに存在しません」です。

xamlクラスのコードは次のとおりです。

[Export]
    [PartCreationPolicy(CreationPolicy.NonShared)]
    public partial class EsriMapView : DialogWindowBase
    {
        //private int? initialZoom = null;
        //private double? latitude = null;
        //private double? longitude = null;

        //private string json = string.Empty;
        //private ObservableCollection<LocationPoint> marks = null;
        //private bool isZoomToBounds = false;

        //private string startPoint = string.Empty;
        //private string endPoint = string.Empty;

        //private string searchPoint = string.Empty;

        public EsriMapView()
        {
            InitializeComponent();            
        }

        [Import]
        public EsriMapViewModel ViewModel
        {
            get
            {
                return this.DataContext as EsriMapViewModel;
            }
            set
            {
                this.DataContext = value;
            }
        }

    }
}

私もMVVMを使用しています。さらに情報が必要な場合は、お知らせください。再度、感謝します。

4

1 に答える 1

0

ビューモデルからビューにアクセスしようとしてはいけません。これはMVVMの信条の1つを破り、VMのテストを困難にします。代わりに、VMはビューがバインドするプロパティを公開する必要があります。その後、VMは、そのジョブを実行するために必要なデータにアクセスできます。

簡単な例として、計算を実行するために、ビューモデルが現在のズームレベルを知る必要があるとします。ビューモデルでは、次のようになります。

public double Zoom
{
    get { return this.zoom; }
    set
    {
        if (this.zoom != value)
        {
            this.zoom = value;
            this.RaisePropertyChanged(() => this.Zoom);
        }
    }
}

private void DoSomeCalculation()
{
    // can use this.zoom here
}

次に、あなたの見解では:

<Slider Value="{Binding Zoom}"/>
于 2012-07-11T18:13:49.810 に答える