我首先会提到具体细节,然后提一下我要做的事情。
我的NewPersonViewModel
中有一个方法private void AddNewPerson()
{
// code to get Panoroma
// more code to get the active panorama item
_navigationService.NavigateTo(new Uri(@"/View/NewPerson.xaml", UriKind.Relative));
}
但我不知道如何获得对MainPage全景图的引用。
我知道如何获取另一个ViewModel的属性,如下所示:
var mainvm = (new ViewModelLocator()).Main;
mainvm.Milestones.Add(NewMilestone);
然而,与上面的里程碑属性不同,Panorama只是mainpage.xaml中的一个ui控件,我没有那个可以从代码中检索的东西。
我正在使用MVVMlight。
我认为他们在这栋楼里关闭了互联网接入,必须发送。 史蒂夫
答案 0 :(得分:0)
通常,MVVM的观点是您的ViewModel不直接与View对话。如果您的View需要显示某些内容,它将具有到ViewModel的数据绑定。
关于您的代码,解决方案是在ViewModel上创建一个公共属性,您可以通过ViewModelLocator在View的代码隐藏构造函数中设置该属性。这样,任何引用ViewModel的人都会引用该特定的View。
PanoramaViewModel.cs
ViewModel {
public Panorama m_Panorama {get;set;}
...
}
PanoramaView.xaml
<phone:Panorama x:Name="AddPersonPanorama">
...
</phone:Panorama>
PanoramaView.xaml.cs
PanoramaView {
PanoramaView() {
App.ViewModelLocator.ViewModel.m_Panorama = this.AddPersonPanorama;
}
}
ReferenceToPanorama.cs
Class {
App.ViewModelLocator.ViewModel.m_Panorama.DoSomething();
}
我建议阅读MVVM,并考虑采用更多的MVVM方式实现这一目标。祝你好运!
答案 1 :(得分:0)
如果你想在你的视图模型中获得SelectedIndex,你应该能够直接绑定它。
在你的xaml中:
<phone:Panorama SelectedIndex="{Binding SelectedPageIndex, Mode=OneWyToSource}">
<!-- items -->
</phone:Panorama>
在您的Viewmodel中
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;
}