2016-04-10 8 views
5

का उपयोग कर विंडोज 10 यूडब्लूपी मैं विजुअल स्टूडियो 2015 का उपयोग 1 अपडेट के साथ कर रहा हूं। मैंने 2 रिक्त पेजों के साथ एक नया यूडब्ल्यूपी विंडोज 10 एप्लीकेशन बनाया है। पहले पृष्ठ में एक आइटम क्लिक ईवेंट के साथ एक ग्रिड व्यू है। जिस ऑब्जेक्ट को मैं ग्रिड व्यूइटम में बाध्यकारी कर रहा हूं, उस स्ट्रिंग फ़ील्ड "लिंक" में है जिसमें पृष्ठ का नाम है, जिसे मैं इस ग्रिड व्यूइटम पर क्लिक करते समय नेविगेट करूंगा।वीएस2015 में एक पृष्ठ पर नेविगेट करना पैरामीटर

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 कनवर्टर:

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

के पीछे कोड:

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 उपयोग कर सकते हैं 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) }); 
} 
संबंधित मुद्दे