0

我是 WPF 和 C# 的新手。访问另一个类中的控件或对象(例如文本框、按钮等)的最佳方式是什么。下面说明我的情况。如果这有所作为,我也在使用 MEF。任何帮助,将不胜感激。谢谢你。

EsriMapView.xaml 是包含所有对象的位置。用于此的类是 EsriMapView.xaml.cs。

EsriMapViewModel.cs 是我尝试从中访问 EsriMapView.xaml 的另一个类。我在所有对象上收到的错误是“当前上下文中不存在名称空白”。

这是来自 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 的原则之一,这使得测试你的虚拟机变得困难。相反,您的 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 回答