2016-04-10 27 views
5

我正在使用Visual Studio 2015和更新1.我創建了一個具有2個空白頁的新的UWP Windows 10應用程序。 第一頁有一個帶有itemClick事件的GridView。我綁定到GridViewItem的對象有一個字符串字段「Link」,其中包含我將導航到的頁面的名稱,當單擊此GridViewItem時。導航到VS2015中的頁面使用參數的Windows 10 UWP

private void GridView_ItemClick(object sender, ItemClickEventArgs e) 
    { 
     var link = (sender as Menu).Link; 
     Frame.Navigate(typeof(link)); 
    } 

但是這是不可能的...因爲這裏的「鏈接」就像一個類型一樣使用。 有沒有辦法將它施放,並使其工作?

回答

1

首先,當您使用ItemClick event時,「發件人」不是您的Menu類,它是GridView控件本身。所以你的代碼var link = (sender as Menu).Link;應該得到一個空引用異常。

在這裏我可以提供兩種方式來完成這項工作,但所有的這兩種方式使用SelectionChanged event這樣的:

private void gridView_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    var link = (gridView.SelectedItem as Menu).Link; 
    Frame.Navigate(link); 
} 

首先一個,定義你的Menu類兩個屬性是這樣的:

public class Menu 
{ 
    public Type Link { get; set; } 
    public string Name { get; set; } 
} 

,並使用GridView這樣的:

<GridView x:Name="gridView" ItemsSource="{x:Bind menu}" SelectionChanged="gridView_SelectionChanged"> 
    <GridView.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Name}" FontSize="25" /> 
     </DataTemplate> 
    </GridView.ItemTemplate> 
</GridView> 

後面的代碼將數據添加到GridView

private ObservableCollection<Menu> menu = new ObservableCollection<Menu>(); 

public MainPage() 
{ 
    this.InitializeComponent(); 
} 

protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    menu.Clear(); 
    menu.Add(new Menu { Link = typeof(Link1), Name = typeof(Link1).Name }); 
    menu.Add(new Menu { Link = typeof(Link2), Name = typeof(Link2).Name }); 
    menu.Add(new Menu { Link = typeof(Link3), Name = typeof(Link3).Name }); 
} 

第二個,你可以定義在Menu類中的一個特性,但使用一個轉換器來顯示每個頁面的名稱。

Menu類:

public class Menu 
{ 
    public Type Link { get; set; } 
} 

TypeToStringConverter轉換器:

public class TypeToStringConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     if (value == null) 
      return "Error"; 
     var link = (value as Menu).Link; 
     return link.Name; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     throw new NotImplementedException(); 
    } 
} 

而且你可以使用這個轉換器和XAML的GridView這樣的:

<Page.Resources> 
    <local:TypeToStringConverter x:Key="cvt" /> 
</Page.Resources> 

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <GridView x:Name="gridView" ItemsSource="{x:Bind menu}" SelectionChanged="gridView_SelectionChanged"> 
     <GridView.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Converter={StaticResource cvt} }" FontSize="25" /> 
      </DataTemplate> 
     </GridView.ItemTemplate> 
    </GridView> 
</Grid> 

後面的代碼將數據添加到GridView

private ObservableCollection<Menu> menu = new ObservableCollection<Menu>(); 

public MainPage() 
{ 
    this.InitializeComponent(); 
} 

protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    menu.Clear(); 
    menu.Add(new Menu { Link = typeof(Link1) }); 
    menu.Add(new Menu { Link = typeof(Link2) }); 
    menu.Add(new Menu { Link = typeof(Link3) }); 
} 
相關問題