2013-07-08 68 views
0

我正在開發Windows 8商店應用程序。我想在GridView中顯示以前選擇的項目,如果來回導航,選擇的項目應顯示selected.I已嘗試This tutorial在GridView中顯示以前的選擇

並且完全按照建議。但它不適用於我的情況。我還與指數試圖爲

int index = myGridView.SelectedIndex 

以便找到索引,並直接提供

myGridView.SelectedIndex = index ; 

但其又沒有用,因爲我不是在

SelectionChanged(object sender, SelectionChangedEventArgs e){}; 
越來越變成索引

什麼有效

myGridView.SelectAll(); 

它選擇所有的元素。但我不想要這個。請幫幫我?在此先感謝

請參考我的代碼

<GridView x:Name="MyList" HorizontalAlignment="Left" VerticalAlignment="Top" Width="auto" Padding="0" Height="600" Margin="0" ScrollViewer.HorizontalScrollBarVisibility="Disabled" SelectionMode="Multiple" SelectionChanged="names_SelectionChanged" ItemClick="mylist_ItemClick" SelectedItem="{Binding Path=selectedItem}"> 
        <GridView.ItemTemplate> 
         <DataTemplate> 
          <StackPanel Width="260" Height="80">          
           <TextBlock Text="{Binding Path=Name}" Foreground="White" d:LayoutOverrides="Width" TextWrapping="Wrap"/>          
          </StackPanel> 
         </DataTemplate> 
        </GridView.ItemTemplate> 
       </GridView> 

這是我處理的

public sealed partial class MyClass: MyApp.Common.LayoutAwarePage, INotifyPropertyChanged 
{ 
    SQLite.SQLiteAsyncConnection db; 

    public MyClass() 
    { 
     this.InitializeComponent(); 
     Constants.sourceColl = new ObservableCollection<MyModel>(); 
    } 

    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     getData(); 
     foreach (MyModel item in Constants.sourceColl) 
     MyList.SelectedItems.Add(item); 
    } 

    private async void getData() 
    { 
     List<MyModel> mod = new List<MyModel>(); 
     var query = await db.Table<MyModel>().Where(ch => ch.Id_Manga == StoryNumber).ToListAsync(); 
     foreach (var _name in query) 
     { 
      var myModel = new MyModel() 
      { 
       Name = _name.Name 
      }; 

      mod.Add(myModel); 
      Constants.sourceColl.Add(myModel); 
     } 
     MyList.ItemsSource = mod; 
    } 

    private void names_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    {    
     GridView myGridView = sender as GridView; 
     if (myGridView == null) return; 
     Constants.sourceColl = (ObservableCollection<MyModel>)myGridView.SelectedItems; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void NotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    private MyModel _selectedItem; 

    public MyModel selectedItem 
    { 
     get 
     { 
      return _selectedItem; 
     } 
     set 
     { 
      if (_selectedItem != value) 
      { 
       _selectedItem = value; 
       NotifyPropertyChanged("selectedItem"); 
      } 
     } 
    } 
} 

下面的類是我的模型

class MyModel 
{ 
    [PrimaryKey, AutoIncrement] 
    public int id { get; set; } 
    public String Name { get; set; } 
} 

回答

1

你好rahul我剛剛解決了你面臨的問題不是完美的方式,但它會在你的代碼中工作。嘗試遵循它。 首先我做了哪些存儲先前所選項目(lstSubSelectedItems)一個單獨的類..這樣

public class checkClass 
{ 
    static ObservableCollection<Subject> _lstSubSelectedItems = new ObservableCollection<Subject>(); 


    static checkClass chkclss; 

    public static checkClass GetInstance() 
    { 
     if (chkclss == null) 
     { 
      chkclss = new checkClass(); 
     } 
     return chkclss; 
    } 



    public ObservableCollection<Subject> lstSubSelectedItems 
    { 
     get 
     { 
      return _lstSubSelectedItems; 
     } 
     set 
     { 
      _lstSubSelectedItems = value; 
     } 

    } 

} 

我已經填寫在這樣pagenavigationfrom方法lstSubSelectedItems ..這裏lstsub是selectedsubjects ..

protected override void OnNavigatedFrom(NavigationEventArgs e) 
    { 
     checkClass obj = checkClass.GetInstance(); 
     obj.lstSubSelectedItems = lstsub; 
    } 

下面是我在構造函數中所做的解決方法... 這裏我使用gridview.selecteditems的removeat函數刪除了非選定的項目。其他函數沒有對此進行此操作(我不知道爲什麼)。主題類就像你的模型類。並選定的項目設置不工作,爲什麼我選擇這種方式...希望這種幫助。

public SelectSubject() 
    { 
     this.InitializeComponent(); // not required 
     objselectsubjectViewmodel = new SelectSubjectViewModel(); // not required 
     groupedItemsViewSource.Source = objselectsubjectViewmodel.Categories; // not required the way set the itemssource of grid. 
     this.DataContext = this; 
     checkClass obj = checkClass.GetInstance(); 

     if (obj.lstSubSelectedItems.Count > 0) 
     { 
     // List<Subject> sjsfj = new List<Subject>(); 
      // ICollection<Subject> fg = new ICollection<Subject>(); 
      itemGridView.SelectAll(); 
     // int i = 0; 
      List<int> lstIndex = new List<int>(); 



      foreach (Subject item1 in itemGridView.SelectedItems) 
      { 
       foreach (var item3 in obj.lstSubSelectedItems) 
       { 
        if (item3.SubjectCategory == item1.SubjectCategory && item3.SubjectName == item1.SubjectName) 
        { 
         lstIndex.Add(itemGridView.SelectedItems.IndexOf(item1)); 
        } 
       } 
      } 

      int l = itemGridView.SelectedItems.Count; 

      for (int b = l-1; b >= 0; b--) 
      { 
       if (!lstIndex.Contains(b)) 
       { 
        itemGridView.SelectedItems.RemoveAt(b); 
       } 
      } 
     } 


    } 

告訴我,如果你的作品...

+0

是的,它的工作很好,我知道這不是一個好的方法,但現在它的工作,所以非常感謝你的巨大努力。如果你發現任何好的選擇,然後請讓我知道,我會也嘗試相同的 –

+0

好吧,我會盡快更新它,一旦我找到更好的解決方案。 – loop

0

您可以設置selectedItems屬性爲此首先進行gridView使得observableCollection和選擇不斷更新這個集合更改你的gridView的事件。當你回到這個頁面時,設置GridViewName.SelectedItems = aboveCollection;

private ObservableCollection<Subject> lstsub = new ObservableCollection<Subject>() ; 



    private void itemGridView_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     checkTemp = 1; 
     GridView tempObjGridView = new GridView(); 
     tempObjGridView = sender as GridView; 
     lstsub = tempObjGridView.SelectedItems; 
    } 
protected override void LoadState(Object navigationParameter, Dictionary<String, Object> pageState) 
    { 
     yourGridName.SelectedItems = lstsub ; 
    } 
+1

LoadState的可能是頁 – loop

+0

感謝答覆onnavigatedtoFuntion。它需要強制轉換,我們無法將ObservableCollection 轉換爲列表,反之亦然,如果明確強制轉換,則會給InvalidCastException帶來錯誤。您有任何建議嗎? –

+0

好的,你可以通過使用list來完成它,但是在這種情況下,你必須在你的類中使用INOTIFYPROPERTYCHANGED實現。每當你使用列表讓它們變成observablecollection時,每次都會更好。 – loop