我会先提到细节,然后再提到我想做什么。
我的新人视图模型中有一个方法
private void AddNewPerson()
{
// code to get Panoroma
// more code to get the active panorama item
_navigationService.NavigateTo(new Uri(@"/View/NewPerson.xaml", UriKind.Relative));
}
但我不确定如何获得对我的主页全景的引用。
我知道如何获取另一个视图模型的属性,如下所示:
var mainvm = (new ViewModelLocator()).Main;
mainvm.Milestones.Add(NewMilestone);
但是,与上面的里程碑属性不同,全景只是 mainpage.xaml 中的一个 ui 控件,我没有将其用作从代码中检索的内容。
我正在使用MVVMlight。
我认为他们正在关闭这栋大楼的互联网接入,必须发送。史蒂夫
一般来说,MVVM 的要点是你的 ViewModel 不直接与视图通信。如果您的视图需要显示某些内容,它将具有到视图模型的数据绑定。
对于代码,解决方案是通过 ViewModelLocator 在 ViewModel 上创建一个公共属性,该属性是在视图的代码隐藏构造函数中设置的。这样,任何引用您的 ViewModel 的人都可以引用该特定视图。
全景视图模型.cs
ViewModel {
public Panorama m_Panorama {get;set;}
...
}
全景视图.xaml
<phone:Panorama x:Name="AddPersonPanorama">
...
</phone:Panorama>
全景视图.xaml.cs
PanoramaView {
PanoramaView() {
App.ViewModelLocator.ViewModel.m_Panorama = this.AddPersonPanorama;
}
}
参考全景图.cs
Class {
App.ViewModelLocator.ViewModel.m_Panorama.DoSomething();
}
我建议阅读 MVVM 并考虑一种更 MVVM 的方式来实现这一目标。祝你好运!
如果要在视图模型中获取 SelectedIndex,应该能够直接绑定到它。
在您的 xaml 中:
<phone:Panorama SelectedIndex="{Binding SelectedPageIndex, Mode=OneWyToSource}">
<!-- items -->
</phone:Panorama>
在您的视图模型中
private int _index;
public int SelectPageIndex
{
get { return _index; }
set { _index = value; }
// no need for property changed event if only getting
}
现在,当您需要它从访问该物业时
int currentPage = SelectedPageIndex;
string uri = string.Format("/View/NewPerson.xaml?type={0}", currentPage);
_navigationService.NavigateTo(new Uri(uri, UriKind.Relative));
如果无法绑定到它,则可以订阅 SelectionChanged 事件,并从该事件处理程序设置 SelectedPageIndex
private void OnSelectionChanged(object sender, SelectionChangedEventArgs selectionChangedEventArgs)
{
ViewModel.SelectedPageIndex = CCPanorama.SelectedIndex;
}