0

我将首先提及具体细节,然后提及我正在尝试做的事情。

我的 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);

但是,与上面的 Milestones 属性不同,Panorama 只是 mainpage.xaml 中的一个 ui 控件,我无法从代码中检索它。

我正在使用 MVVMlight。

我认为他们正在关闭这栋大楼的互联网访问,必须发送。史蒂夫

4

2 回答 2

0

一般来说,MVVM 的重点是您的 ViewModel 不直接与 View 对话。如果您的 View 需要显示某些内容,它将具有与您的 ViewModel 的数据绑定。

关于您的代码,解决方案是通过 ViewModelLocator 在您在 View 的代码隐藏构造函数中设置的 ViewModel 上创建一个公共属性。这样,任何引用您的 ViewModel 的人都会引用该特定视图。


PanoramaViewModel.cs

    ViewModel {
        public Panorama m_Panorama {get;set;}
        ...
    }

全景视图.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 方式来实现这一点。祝你好运!

于 2013-09-27T03:39:24.800 回答
0

如果您想在视图模型中获取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;
}
于 2013-09-27T17:18:21.753 回答