2012-10-04 21 views
7

en mi aplicación hay gridview de mi clase personalizada. Estoy usando una plantilla de datos personalizada y los valores están vinculados desde SQLite. Ahora, cuando el usuario inicie la aplicación, los elementos determinados (NO SIMPLE) deben preseleccionarse en vista de cuadrícula/vista de lista. Gridview/listview permite una selección múltiple. ¿Cómo puedo lograr esto con la propiedad SelectedItem?¿Cómo preseleccionar múltiples elementos listview/gridview en la aplicación C#/XAML windows 8?

ACTUALIZACIÓN: He seguido this, no funciona para mí. Devuelve 0 selecciones.

ACTUALIZACIÓN 2: He publicado el código

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

Actualización 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; 
} 

Respuesta

6

Finalmente recibí la respuesta de MSDN. Gracias ForInfo

página XAML

<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

Hice lo mismo pero no funcionó en mi caso, no sé por qué? Lo que realmente estoy haciendo es seleccionar algunos elementos de GridView y luego volver a la página anterior y luego regresar a la página anterior, para que los elementos seleccionados previamente se seleccionen, lo que no está sucediendo. ¿Por favor podría usted ayudarme? –

1

Puede utilizar la propiedad SelectedItems.

// 
    // Summary: 
    //  Gets the currently selected items. 
    // 
    // Returns: 
    //  A collection of the currently selected items. 
    public IList<object> SelectedItems { get; } 
+0

+1 para esto, aunque esta colección es de sólo lectura, no puede ser enlazado a datos y hay que rellenar manualmente con artículos preseleccionados. –

+0

Pero, ¿cómo puedo vincular los datos con elementos preseleccionados manualmente? Estoy teniendo 'SelectedValuePath' de la base de datos SQLite. – Xyroid

-1

He eliminado mi respuesta original ya que no estoy utilizando el enlace de datos y mi respuesta no será útil para usted.

yo encontramos este hace un momento que podría ser útil para usted:

"propiedad SelectedItems es de sólo lectura y no se puede establecer directamente"

Por lo tanto, una solución que puede proporcionar ayuda, consulte this artículo .

+0

No estoy usando ListBoxItem individual (o GridViewItem). Estoy vinculando fuente de elementos directamente desde el método 'Query ()' de SQLite. – Xyroid

+0

Actualicé mi respuesta en función de su comentario. –

+0

Gracias, pero no estoy usando MVVM, la aplicación de la mina es simple. ¿Puede por favor darme una aplicación de demostración simple, que contiene varios elementos en gridview y en la aplicación lanzada algunos serán seleccionados. – Xyroid

1

Puede usar la propiedad SelectedItems y llamar a SelectedItems.Add() o SelectedItems.Remove() para agregar/eliminar elementos de la selección.

Si utiliza ItemsSource vinculante para el GridView puede utilizar la propiedad adjunta ListViewExtensions.BindableSelection del WinRT XAML Toolkit (que debería funcionar con un GridView demasiado ya que es una subclase de ListViewBase) como en el sample page.

+0

'protected override void OnNavigatedTo (NavigationEventArgs e) { foreach (elemento var en MyList) // MyList es la lista de mi clase personalizada con propiedad de entero y cadena. {// Contiene el objeto que se preseleccionará en la vista de lista. MyListView.SelectedItems.Añadir artículo); } } ' Intenté esto, no está funcionando. – Xyroid

+0

También probé [esto] (http://denismorozov.blogspot.in/2010/07/wpf-listboxselecteditemsadd-doesnt.html) – Xyroid

+0

Intente compartir más de su código incluyendo XAML, contexto de datos, enlace de ItemsSource, etc. en su original pregunta. –

Cuestiones relacionadas