Bagaimana cara memilih terlebih dahulu beberapa item tampilan daftar/tampilan grid di aplikasi C#/XAML windows 8?

di aplikasi saya ada tampilan grid kelas khusus saya. Saya menggunakan templat data khusus dan nilainya terikat dari SQLite. Sekarang ketika pengguna meluncurkan aplikasi, item tertentu (BUKAN TUNGGAL) harus dipilih sebelumnya di tampilan grid/tampilan daftar. Gridview/listview memungkinkan banyak pilihan. Bagaimana saya bisa mencapai ini dengan properti SelectedItem?

PEMBARUAN : Saya telah mengikuti ini, ini tidak berhasil untuk saya. Mengembalikan 0 pilihan.

PEMBARUAN 2 : Saya telah memposting kodenya

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

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

person Farhan Ghumra    schedule 04.10.2012    source sumber


Jawaban (4)


Akhirnya mendapat jawaban dari MSDN. Terima kasih ForInfo

halaman 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; }
}
person Farhan Ghumra    schedule 16.10.2012
comment
Saya melakukan hal yang sama tetapi tidak berhasil dalam kasus saya, saya tidak tahu mengapa? Apa yang sebenarnya saya lakukan adalah memilih beberapa item dari GridView dan kemudian kembali ke halaman sebelumnya dan kemudian kembali ke halaman sebelumnya, jadi item yang dipilih sebelumnya harus dipilih, dan hal ini tidak terjadi. Maukah Anda membantu saya? - person Rahul Saksule; 08.07.2013

Anda dapat menggunakan properti SelectedItems.

    //
    // Summary:
    //     Gets the currently selected items.
    //
    // Returns:
    //     A collection of the currently selected items.
    public IList<object> SelectedItems { get; }
person Whyllee    schedule 04.10.2012
comment
+1 untuk ini, meskipun koleksi ini hanya dapat dibaca, tidak dapat terikat data dan Anda harus mengisinya secara manual dengan item yang telah dipilih sebelumnya. - person Martin Suchan; 04.10.2012
comment
Tetapi bagaimana saya bisa mengikat data dengan item yang telah dipilih sebelumnya secara manual? Saya baru saja mendapatkan SelectedValuePath dari database SQLite. - person Farhan Ghumra; 04.10.2012

Anda dapat menggunakan properti SelectedItems dan memanggil SelectedItems.Add() atau SelectedItems.Remove() untuk menambah/menghapus item dari pilihan.

Jika Anda menggunakan pengikatan ItemsSource pada GridView, Anda dapat menggunakan ListViewExtensions.BindableSelection properti terlampir dari WinRT XAML Toolkit (seharusnya juga berfungsi dengan GridView karena merupakan subkelas ListViewBase) seperti pada laman contoh.

person Filip Skakun    schedule 04.10.2012
comment
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); } } Saya mencobanya, tidak berhasil. - person Farhan Ghumra; 05.10.2012
comment
Saya juga mencoba ini - person Farhan Ghumra; 05.10.2012
comment
Coba bagikan lebih banyak kode Anda termasuk XAML, konteks data, pengikatan ItemsSource, dll. dalam pertanyaan awal Anda. - person Filip Skakun; 05.10.2012
comment
Mungkin Database.Tag dari salah satu daftar Anda tidak pernah sama dengan Database.Tag mana pun di daftar lainnya. Anda mungkin harus menggunakan tipe yang berbeda untuk model tampilan item Anda dari apa pun yang Anda dapatkan dari database. - person Filip Skakun; 08.10.2012
comment
objeknya serupa, di kedua sisi nilainya sama di if ((Database.Tag)lvitem == item) - person Farhan Ghumra; 09.10.2012
comment
Mirip! = sama. Sudahkah Anda menerapkan operator Equals untuk tipe itu? - person Filip Skakun; 09.10.2012
comment
Ini mengembalikan salah. Tolong sarankan saya beberapa solusi. - person Farhan Ghumra; 09.10.2012
comment
override Sama dengan untuk membandingkan properti yang menunjukkan itemnya sama - baik beberapa ID atau semua properti. - person Filip Skakun; 09.10.2012
comment
Saya telah mengganti Equals() (lihat Pembaruan 3 yang dimaksud). lvTags.SelectedItems memiliki entitas tetapi tampilan daftar tidak menunjukkan entitas tersebut dipilih. - person Farhan Ghumra; 09.10.2012
comment
Apakah SelectedItems.Add() dipanggil? - person Filip Skakun; 09.10.2012
comment
ya, lvTags.SelectedItems.Add(lvitem) dipanggil dan lvTags.SelectedItems.Count juga lebih besar dari nol yaitu nilai hitungannya sama dengan MyList.Count. Saya menyarankan Anda memberi saya contoh proyek itu. Saya akan sangat berterima kasih kepada Anda. - person Farhan Ghumra; 09.10.2012
comment
Maaf, saya agak tersesat dalam hal ini. Saya pikir Anda perlu mengerjakan ulang kode Anda untuk mendapatkan item sebagai item model tampilan dan mengerjakan daftar yang disesuaikan untuk tampilan Anda alih-alih mengandalkan langsung pada objek yang berasal dari db.Table‹Database.Tag›(). Mungkin item yang Anda coba tambahkan ke SelectedItems bukan item yang sama yang ditetapkan ke ItemsSource. - person Filip Skakun; 09.10.2012
comment
Itu sebabnya saya memberitahu Anda, tolong beri saya contoh proyek, jelaskan skenario yang saya inginkan. Tolong, saya memerlukan fitur itu untuk proyek saya. - person Farhan Ghumra; 10.10.2012

Saya menghapus jawaban asli saya karena Anda tidak menggunakan pengikatan data dan jawaban saya tidak akan berguna bagi Anda.

Saya baru saja menemukan ini yang mungkin berguna bagi Anda:

"Properti SelectedItems hanya dapat dibaca, dan tidak dapat disetel secara langsung"

Oleh karena itu, untuk solusi yang dapat memberikan bantuan, lihat artikel ini.

person Mamta D    schedule 04.10.2012
comment
Saya tidak menggunakan ListBoxItem individual (atau GridViewItem). Saya mengikat sumber item langsung dari metode Query<T>() SQLite. - person Farhan Ghumra; 04.10.2012
comment
Memperbarui jawaban saya berdasarkan komentar Anda. - person Mamta D; 04.10.2012
comment
Terima kasih, tapi saya tidak menggunakan MVVM, aplikasi saya sederhana. Bisakah Anda memberi saya aplikasi demo sederhana, yang berisi beberapa item dalam tampilan grid dan saat aplikasi diluncurkan, beberapa akan dipilih. - person Farhan Ghumra; 04.10.2012