在我的MainPage.xaml
中,我创建了一个数据透视表控件:<controls:Pivot Title="Powder God" Name="PivotControl">
。
我的第一个数据透视图是一个HubTile
,它汇总了所有其他个别网页。所以我的应用程序栏在第一个数据透视图和所有其他数据透视图之间会有所不同。
这就是为什么我把我的应用程序栏放在App.xaml
的资源部分,然后根据我的数据库的选定索引加载。
我的问题是:
在我将用于所有单个页面的应用程序栏中,我想要一个删除选项,我将从我的数据上下文中删除该特定项目(视图模型)。
我知道我可以使用PhoneApplicationFrame root = Application.Current.RootVisual as PhoneApplicationFrame;
来访问导航服务,但我不知道如何引用我的数据透视表,以便我可以获得所选索引并继续前进。
谢谢!
答案 0 :(得分:3)
使用MVVM你不应该这样做:
((PageType)Application.Current.RootVisual).PivotControl. //Blah
PageType是包含您的PivotControl的任何类型的PhoneApplicationFrame。如果这不起作用,则需要RootVisual中的属性
public Pivot MyPivot
{
get
{
return PivotControl;
}
}
((PageType)RootVisual).MyPivot. //Blah
答案 1 :(得分:3)
在某种程度上,微软建议将ApplicationBar
放在App.xaml
中是很好的,因为它可以从任何地方引用,并且似乎鼓励代码重用:但是这个问题突出了这种方法的限制。应用程序栏通常用于提供特定于当前页面(或枢轴项)的操作,并且仅因为按钮相同,您可能不希望在每种情况下都运行完全相同的代码。
在这种情况下,我认为最好创建一个工厂方法,使用您指定的页面/枢轴项目指定的点击处理程序创建公共ApplicationBar
。对于奖励积分,将该方法放在一个新类(而不是App
)中,这样它就不会在那里的所有样板代码中丢失。在页面构造函数中调用此工厂方法,并记住您班级中的ApplicationBar
。对于多个应用栏,可以预先创建它们,然后您可以在Pivot SelectionChanged代码中轻松切换这些应用栏。
在App.xaml
中创建ApplicationBar然后在代码中从App.xaml.cs
“资源”ResourceDictionary
检索这个,修改点击回调的替代方法在我看来更复杂。 / p>
我希望他们在实施ApplicationBar
方面做得更好,所以人们不想这样做。我发现使用ApplicationBar会强制您向Page.xaml.cs
添加代码,即使您使用的是像MVVM Light这样的框架。这在MVVM中仍然可以,因为它是属于View的UI特定代码,但如果你在其他地方使用ICommand
,它会使事情不一致。上次我决定最好在代码中创建整个ApplicationBar
,而不是通过App.xaml.cs
破解此类内容。