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