2016-04-10 23 views
5

Tôi đang sử dụng Visual Studio 2015 với Bản cập nhật 1. Tôi đã tạo một ứng dụng UWP Windows 10 mới với 2 Trang Trống. Trang đầu tiên có GridView với sự kiện itemClick. Đối tượng mà tôi đang ràng buộc với GridViewItem có một trường chuỗi "Liên kết" có chứa tên của Trang tôi sẽ điều hướng đến, khi nhấp vào GridViewItem này.Điều hướng đến một Trang trong VS2015 Windows 10 UWP bằng cách sử dụng Tham số

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

Nhưng điều này là không thể ... vì "liên kết" ở đây được sử dụng như một loại. Có cách nào để truyền và làm cho nó hoạt động không?

Trả lời

1

Trước hết, khi bạn sử dụng ItemClick event, "người gửi" không phải là lớp Menu của bạn, chính nó là kiểm soát GridView. Vì vậy, mã của bạn var link = (sender as Menu).Link; sẽ nhận được ngoại lệ tham chiếu null.

Ở đây tôi có thể cung cấp hai cách để làm công việc này, nhưng tất cả hai cách sau đây đang sử dụng SelectionChanged event như thế này:

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

Đầu tiên một, xác định hai thuộc tính trong lớp Menu của bạn như thế này:

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

Và sử dụng GridView như thế này:

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

mã phía sau để thêm dữ liệu vào 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 }); 
} 

Second một, bạn chỉ có thể xác định một tài sản trong lớp Menu, nhưng sử dụng một chuyển đổi để hiển thị tên của mỗi trang.

Menu lớp:

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

các TypeToStringConverter chuyển đổi:

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

Và bạn có thể sử dụng chuyển đổi này và GridView trong XAML như thế này:

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

mã phía sau để thêm dữ liệu vào 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) }); 
} 
Các vấn đề liên quan