7

in my app there is gridview of my custom class. I am using custom data template and values are bound from SQLite. Now when user launch the app, the certain items (NOT SINGLE) should be pre-selected in gridview/listview. Gridview/listview allows multiple selection. How can I achieve this with SelectedItem property ?

UPDATE : I have followed this, it doesn't work for me. Returns 0 selections.

UPDATE 2 : I have posted the code

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;
}
Mathew Thompson
  • 55,877
  • 15
  • 127
  • 148
Farhan Ghumra
  • 15,180
  • 6
  • 50
  • 115

4 Answers4

6

Finally got answer from MSDN. Thanks ForInfo

XAML page

<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; }
}
Farhan Ghumra
  • 15,180
  • 6
  • 50
  • 115
  • I did same but not working in my case, I don't know why? What I am actually doing is selecting some items from GridView and then go back to previous page and then return on previous page, so items previously selected should be selected, which is not happening. Will You please help me? – Rahul Saksule Jul 08 '13 at 09:16
2

You can use SelectedItems property.

    //
    // Summary:
    //     Gets the currently selected items.
    //
    // Returns:
    //     A collection of the currently selected items.
    public IList<object> SelectedItems { get; }
Whyllee
  • 281
  • 1
  • 7
  • +1 for this, although this collection is readonly, cannot be databound and you have to populate it manually with pre-selected items. – Martin Suchan Oct 04 '12 at 08:09
  • But how can I data bind it with manually pre-selected items ? I am having just `SelectedValuePath` from SQLite database. – Farhan Ghumra Oct 04 '12 at 09:38
2

You can use the SelectedItems property and call SelectedItems.Add() or SelectedItems.Remove() to add/remove items from selection.

If you use ItemsSource binding on the GridView you can use the ListViewExtensions.BindableSelection attached property from the WinRT XAML Toolkit (it should work with a GridView too since it is a subclass of ListViewBase) as in the sample page.

Filip Skakun
  • 31,624
  • 6
  • 74
  • 100
  • `protected override void OnNavigatedTo(NavigationEventArgs e) { foreach (var item in MyList) //MyList is the list of my custom class having integer and string property. { //It contains the object which will be preselected in listview. MyListView.SelectedItems.Add(item); } }` I tried this, it is not working. – Farhan Ghumra Oct 05 '12 at 10:38
  • I also tried [this](http://denismorozov.blogspot.in/2010/07/wpf-listboxselecteditemsadd-doesnt.html) – Farhan Ghumra Oct 05 '12 at 10:53
  • Try sharing more of your code including XAML, data context, ItemsSource binding etc. in your original question. – Filip Skakun Oct 05 '12 at 15:07
  • Perhaps Database.Tag from one of your list never equals any Database.Tag in the other list. You should possibly use a different type for your item view models than whatever you get from the database. – Filip Skakun Oct 08 '12 at 18:09
  • the objects are similar, at both side values are same at `if ((Database.Tag)lvitem == item)` – Farhan Ghumra Oct 09 '12 at 04:42
  • Similar != same. Have you implemented Equals operators for that type? – Filip Skakun Oct 09 '12 at 04:59
  • It returns false. Please suggest me some solution. – Farhan Ghumra Oct 09 '12 at 05:14
  • override Equals to compare properties that indicate the items are the same - either some ID or all properties. – Filip Skakun Oct 09 '12 at 05:52
  • I have override the Equals() (see Update 3 in question). `lvTags.SelectedItems` is having the entities but the list view doesn't show them selected. – Farhan Ghumra Oct 09 '12 at 07:16
  • Is SelectedItems.Add() getting called? – Filip Skakun Oct 09 '12 at 08:40
  • yes, `lvTags.SelectedItems.Add(lvitem)` is called and `lvTags.SelectedItems.Count` is also greater than zero i.e. it is the same count value as `MyList.Count`. I suggest you to give me any sample project of that. I will be much thankful to you. – Farhan Ghumra Oct 09 '12 at 09:36
  • Sorry, I'm a bit lost in this. I think you would need to rework your code to get the items as view model items and work on the list tailored for your view instead of relying directly on objects coming from db.Table(). Perhaps the items you are trying to add to SelectedItems aren't the same items that are assigned to ItemsSource. – Filip Skakun Oct 09 '12 at 15:21
  • That's why I am telling you, please give me sample project, explaining the scenario which I want. Please I need that feature for my project. – Farhan Ghumra Oct 10 '12 at 05:09
-1

I deleted my original answer since yo are not using data binding and my answer wont be useful to you.

I found this just now that might be useful to you:

"SelectedItems property is read only, and cannot be set directly"

Hence, for a solution that may provide help, refer this article.

Mamta D
  • 6,310
  • 3
  • 27
  • 41
  • I am not using individual ListBoxItem (or GridViewItem). I am binding items source directly from SQLite's `Query()` method. – Farhan Ghumra Oct 04 '12 at 09:36
  • Updated my answer based on your comment. – Mamta D Oct 04 '12 at 10:02
  • Thanks, but I am not using MVVM, mine app is simple. Can you please give me simple demo app, that contain several items in gridview and on app launched some will be selected. – Farhan Ghumra Oct 04 '12 at 11:08