如何在共享应用程序资源中实现导航button?

我目前正在尝试创build一个简单的应用程序,从我制作的API中提取数据并将其显示在列表中。 然后,您应该能够单击列表项目导航到一个图像查看器等详细的查看页面。为了这个工作,我需要导航到一个名为PlanViewer.xaml的页面(目前只适用于Windows Phone应用程序部分,尽pipe这两者虽然)。

对于我的列表工作,我在我的共享App.xaml构build了以下数据模板:

  <DataTemplate x:Key="PlanDataTemplate"> <StackPanel Orientation="Horizontal"> <Button Name="NavigatePlan" Tag="{Binding FilePath}"> <StackPanel> <TextBlock Style="{StaticResource SubheaderTextBlockStyle}" Text="{Binding Name}" /> <TextBlock Style="{StaticResource TitleTextBlockStyle}" Text="{Binding LastUpdate}" /> </StackPanel> </Button> </StackPanel> </DataTemplate> 

我将它应用于我的MainPage.xaml ,如下所示:

 <ItemsControl x:Name="PlanList" ItemTemplate="{StaticResource PlanDataTemplate}" ItemsSource="{Binding PlanItems}" > <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <VirtualizingStackPanel /> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> </ItemsControl> 

我不能将任何事件绑定到App.xaml的button,所以我想我需要使用一个ICommand接口。 到目前为止,我可能还有一个更重要的错误。

TL; DR为我的目标:我想调整数据模板,使每个button链接到一个页面PlanViewer.xaml与一个参数描述哪个计划应该显示(例如ID或文件path)。

这是一款通用应用解决scheme。 它可以基本上查看Model,View和ViewModel的教程。

我不知道你要使用什么UI元素,但是为此我将selectWindows 8.1和WP 8.1都支持的元素。 ListView,所以在这两个项目的MainPage.xaml让我们定义。


 <ListView x:Name="myListView"> <ListView.ItemTemplate> <DataTemplate> <StackPanel> <TextBlock Text="{Binding Artist}"></TextBlock> <TextBlock Text="{Binding Song}"></TextBlock> <Button Command="{Binding ElementName=myListView, Path=DataContext.SimpleCommand}" CommandParameter="{Binding Extra}" x:Name="mybutton" Width="200" Height="50" FontFamily="Global User Interface" Content="Click Me"/> </StackPanel> </DataTemplate> </ListView.ItemTemplate> </ListView> 

正如你所看到的,我使用CommandCommandParameter对Button进行了数据绑定。 该命令是ViewModel中用户单击button时要执行的function。 CommandParameter是要传递给Command函数的对象。 在你的情况下,你的标签。


命名空间

 using System.Collections.ObjectModel; // ObservableCollection using System.Windows.Input; // ICommand 

现在让我们定义一个命令(应该是共享项目的一部分)

 public class MySimpleCommand : ICommand { public void Execute(object parameter) { // do stuff based off your tags string tag = parameter as string; if(tag == "WHATEVER_YOU_WANT") { } // void of the trigger libraries, lets make this simple // navigate to your page Frame rootFrame = Window.Current.Content as Frame; rootFrame.Navigate(typeof(YOUR_PAGE)); } public bool CanExecute(object parameter) { return true; } public event EventHandler CanExecuteChanged; } 

现在让我们设置一个简单的模型(应该是共享项目的一部分)

 public class sample_model { public sample_model(string artist, string song, string extra = "") { this.Artist = artist; this.Song = song; this.Extra = extra; } public string Artist { get; set; } public string Song { get; set; } public string Extra { get; set; } // this is your tag } 

现在让我们为我们的ListView设置一个ViewModel来使用。 (应该是共享项目的一部分)

 public class sample_viewmodel { public sample_viewmodel() { this.DataSource = CreateData(); this.SimpleCommand = new MySimpleCommand(); // create the command } // create a static list for our demo private ObservableCollection<sample_model> CreateData() { ObservableCollection<sample_model> my_list = new ObservableCollection<sample_model>(); my_list.Add(new sample_model("Faith + 1", "Body of Christ", "A Track")); my_list.Add(new sample_model("Faith + 1", "Christ Again", "A Track")); my_list.Add(new sample_model("Faith + 1", "A Night With the Lord", "A Track")); my_list.Add(new sample_model("Faith + 1", "Touch Me Jesus", "A Track")); my_list.Add(new sample_model("Faith + 1", "I Found Jesus (With Someone Else)", "A Track")); my_list.Add(new sample_model("Faith + 1", "Savior Self", "A Track")); my_list.Add(new sample_model("Faith + 1", "Christ What a Day", "A Track")); my_list.Add(new sample_model("Faith + 1", "Three Times My Savior", "A Track")); my_list.Add(new sample_model("Faith + 1", "Jesus Touched Me", "A Track")); my_list.Add(new sample_model("Faith + 1", "Lord is my Savior", "A Track")); my_list.Add(new sample_model("Faith + 1", "I Wasn't Born Again Yesterday", "A Track")); my_list.Add(new sample_model("Faith + 1", "Pleasing Jesus", "A Track")); my_list.Add(new sample_model("Faith + 1", "Jesus (Looks Kinda Hot)", "A Track")); my_list.Add(new sample_model("Butters", "What What", "B Track")); return my_list; } public ICommand SimpleCommand { get; set; } public ObservableCollection<sample_model> DataSource{ get; set; } } 

最后,让ListView链接到我们的ViewModel,它应该绑定“Artist,Song和Button(Command&CommandParamters)”。 我通常在每个页面的加载function中这样做。

 private void Page_Loaded(object sender, RoutedEventArgs e) { sample_viewmodel viewmodel = new sample_viewmodel(); // create the view model myListView.DataContext = viewmodel; // set the datacontext (this will link the commands) myListView.ItemsSource = viewmodel.DataSource; // set the ItemsSource, this will link the Artist,Songs } 

你有它,每次用户点击button,不pipe它将执行命令function的平台。

示例截图 在这里输入图像描述