如何从视图模型访问主页上的全景控件



我会先提到细节,然后再提到我想做什么。

我的新人视图模型中有一个方法

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

最新更新