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