如何从ViewModel访问我的MainPage上的Panorama控件

时间:2013-09-27 00:38:55

标签: windows-phone-8

我首先会提到具体细节,然后提一下我要做的事情。

我的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。

我认为他们在这栋楼里关闭了互联网接入,必须发送。 史蒂夫

2 个答案:

答案 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;
}