2012-10-04 9 views
7

nella mia app c'è il gridview della mia classe personalizzata. Sto usando un modello di dati personalizzati e i valori sono associati a SQLite. Ora quando l'utente avvia l'app, gli elementi determinati (NON SINGOLI) devono essere preselezionati in griglia/listview. Gridview/listview consente una selezione multipla. Come posso ottenere ciò con la proprietà SelectedItem?Come preselezionare più voci listview/gridview in C#/XAML windows 8 app?

AGGIORNAMENTO: Ho seguito this, non funziona per me. Restituisce 0 selezioni.

UPDATE 2: Ho inviato il codice

void MainPage_Loaded(object sender, RoutedEventArgs e) 
{ 
    using (var db = new SQLite.SQLiteConnection(dbpath)) 
    { 
     lvTags.ItemsSource = db.Table<Database.Tag>(); //lvTags is listview 

     if (MyList.Count > 0) //MyList is the static list of class "Database.Tag" 
     { 
      foreach (var item in MyList) 
       foreach (var lvitem in lvTags.Items) 
        if (lvitem.Equals(item)) 
         lvTags.SelectedItems.Add(lvitem); 
     } 
    } 
} 

UPDATE 3:

public override bool Equals(object obj) 
{ 
    Tag tag = obj as Tag; 
    if (this.TagID == tag.TagID && this.TagName == tag.TagName) 
     return true; 
    else 
     return false; 
} 

risposta

6

Finalmente risposta dal MSDN. Grazie ForInfo

XAML pagina

<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}"> 
    <ListView x:Name="listView" SelectionMode="Multiple"> 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal"> 
        <TextBox Text="{Binding ID}" Margin="0,0,5,0"/> 
        <TextBox Text="{Binding Title}"/> 
       </StackPanel> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 
</Grid> 

C#

public sealed partial class MainPage : Page 
{ 
    public MainPage() 
    { 
     this.InitializeComponent(); 
     LoadData(); 
    } 
    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
    } 
    ObservableCollection<KiwiItem> sourceColl; 
    IList<KiwiItem> selectionList; 
    public void LoadData() 
    { 
     var dbPath = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "db.sqlite"); 

     // Exec (1) 
     using (var db = new SQLite.SQLiteConnection(dbPath)) 
     { 
      db.DropTable<KiwiItem>(); 
      db.CreateTable<KiwiItem>(); 
      db.RunInTransaction(() => 
      { 
       db.Insert(new KiwiItem() { ID = 1, Title = "MyTitle1" }); 
       db.Insert(new KiwiItem() { ID = 2, Title = "MyTitle2" }); 
       db.Insert(new KiwiItem() { ID = 3, Title = "MyTitle3" }); 
       db.Insert(new KiwiItem() { ID = 4, Title = "MyTitle4" }); 
      }); 
      this.sourceColl = new ObservableCollection<KiwiItem>(); 
      this.selectionList = new List<KiwiItem>(); 
      // Query the db. In practice, fill the sourceColl according to your business scenario 
      foreach (KiwiItem item in db.Table<KiwiItem>()) 
      { 
       this.sourceColl.Add(item); 
       if (item.ID == 2 || item.ID == 4) 
        this.selectionList.Add(item); 
      } 
     } 

     // Exec (2) 
     this.listView.ItemsSource = this.sourceColl; 
     foreach (KiwiItem item in this.selectionList) 
      this.listView.SelectedItems.Add(item); 
    } 
} 
public class KiwiItem 
{ 
    [SQLite.AutoIncrement, SQLite.PrimaryKey] 
    public int ID { get; set; } 
    public string Title { get; set; } 
} 
+0

Ho fatto lo stesso ma non ho lavorato nel mio caso, non so perché? Quello che sto facendo in realtà è selezionare alcuni elementi da GridView e poi tornare alla pagina precedente e poi tornare alla pagina precedente, quindi gli elementi selezionati in precedenza dovrebbero essere selezionati, il che non sta succedendo. Ti prego, aiutami? –

1

È possibile utilizzare la proprietà SelectedItems.

+0

+1 per questo, anche se questa collezione è in sola lettura, non può essere databound e si deve compilare manualmente con gli oggetti preselezionati. –

+0

Ma come posso associarlo a dati con voci pre-selezionate manualmente? Sto avendo 'SelectedValuePath' dal database SQLite. – Xyroid

-1

Ho eliminato la mia risposta originale poiché non si sta utilizzando l'associazione dati e la mia risposta non sarà utile.

ho trovato questo proprio ora che potrebbe essere utile a voi:

"proprietà SelectedItems è di sola lettura e non possono essere impostate direttamente"

Quindi, per una soluzione che può fornire ulteriori informazioni, consultare this articolo .

+0

Non sto utilizzando singoli ListBoxItem (o GridViewItem). Sono fonte di elementi vincolanti direttamente dal metodo 'Query ()' di SQLite. – Xyroid

+0

Aggiornato la mia risposta in base al tuo commento. –

+0

Grazie, ma non sto usando MVVM, la mia app è semplice. Puoi per favore darmi una semplice app demo, che contiene diversi elementi in griglia e sull'app avviata alcuni saranno selezionati. – Xyroid

1

È possibile utilizzare la proprietà SelectedItems e chiamare SelectedItems.Add() o SelectedItems.Remove() per aggiungere/rimuovere elementi dalla selezione.

Se si utilizza ItemsSource vincolante per il GridView è possibile utilizzare la ListViewExtensions.BindableSelection proprietà associata dal WinRT XAML Toolkit (dovrebbe funzionare con un GridView troppo dal momento che è una sottoclasse di ListViewBase) come nel sample page.

+0

'protected override void OnNavigatedTo (NavigationEventArgs e) { foreach (var item in MyList) // MyList è l'elenco della mia classe personalizzata con proprietà intero e stringa. {// Contiene l'oggetto che sarà preselezionato in listview. MyListView.SelectedItems.Aggiungi articolo); } } Ho provato questo, non funziona. – Xyroid

+0

Ho anche provato [questo] (http://denismorozov.blogspot.in/2010/07/wpf-listboxselecteditemsadd-doesnt.html) – Xyroid

+0

Prova a condividere altro codice, incluso XAML, contesto dati, associazione di elementi, ecc. Nell'originale domanda. –

Problemi correlati