使用我在一个类和另一个类中的控件

时间:2012-07-11 17:57:06

标签: c# wpf class object mvvm

我是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。如果您需要更多信息,请告诉我们。再次感谢。

1 个答案:

答案 0 :(得分:0)

您不应该尝试从视图模型访问您的视图。这打破了MVVM的一个原则,这使得测试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}"/>