จะเลือกรายการ listview / gridview หลายรายการล่วงหน้าในแอป C # / XAML windows 8 ได้อย่างไร

ในแอปของฉันมี gridview ของคลาสที่กำหนดเองของฉัน ฉันกำลังใช้เทมเพลตข้อมูลที่กำหนดเองและค่าต่างๆ ถูกผูกไว้จาก SQLite ตอนนี้เมื่อผู้ใช้เปิดแอป ควรเลือกบางรายการ (ไม่ใช่รายการเดียว) ไว้ล่วงหน้าใน gridview/listview Gridview/listview ช่วยให้สามารถเลือกได้หลายรายการ ฉันจะบรรลุสิ่งนี้ด้วยคุณสมบัติ SelectedItem ได้อย่างไร

อัปเดต : ฉันได้ติดตาม สิ่งนี้ มันไม่ได้ผลสำหรับฉัน ส่งคืน 0 การเลือก

อัปเดต 2 : ฉันได้โพสต์รหัสแล้ว

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

อัปเดต 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 แหล่งที่มา


คำตอบ (4)


ในที่สุดก็ได้รับคำตอบจาก MSDN ขอขอบคุณ ForInfo

หน้า 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
ฉันก็ทำเหมือนกันแต่ไม่ได้ทำงานในกรณีของฉัน ฉันไม่รู้ว่าทำไม? สิ่งที่ฉันกำลังทำคือเลือกบางรายการจาก GridView จากนั้นกลับไปที่หน้าก่อนหน้าแล้วกลับไปที่หน้าก่อนหน้า ดังนั้นควรเลือกรายการที่เลือกไว้ก่อนหน้านี้ซึ่งจะไม่เกิดขึ้น คุณจะช่วยฉันได้ไหม? - person Rahul Saksule; 08.07.2013

คุณสามารถใช้คุณสมบัติ 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 สำหรับสิ่งนี้ แม้ว่าคอลเลกชันนี้จะเป็นแบบอ่านอย่างเดียว แต่ก็ไม่สามารถผูกข้อมูลได้ และคุณต้องเติมรายการที่เลือกไว้ล่วงหน้าด้วยตนเอง - person Martin Suchan; 04.10.2012
comment
แต่ฉันจะผูกข้อมูลกับรายการที่เลือกไว้ล่วงหน้าด้วยตนเองได้อย่างไร ฉันมีเพียง SelectedValuePath จากฐานข้อมูล SQLite - person Farhan Ghumra; 04.10.2012

คุณสามารถใช้คุณสมบัติ SelectedItems และเรียก SelectedItems.Add() หรือ SelectedItems.Remove() เพื่อเพิ่ม/ลบรายการออกจากการเลือก

หากคุณใช้การเชื่อมโยง ItemsSource บน GridView คุณสามารถใช้ ListViewExtensions.BindableSelection คุณสมบัติที่แนบมาจาก WinRT XAML Toolkit (ควรทำงานกับ GridView ได้เช่นกันเนื่องจากเป็นคลาสย่อยของ ListViewBase) เช่นเดียวกับใน หน้าตัวอย่าง

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); } } ฉันลองแล้ว มันใช้งานไม่ได้ - person Farhan Ghumra; 05.10.2012
comment
ฉันยังได้ลอง สิ่งนี้ - person Farhan Ghumra; 05.10.2012
comment
ลองแชร์โค้ดของคุณให้มากขึ้น รวมถึง XAML, บริบทข้อมูล, การเชื่อมโยง ItemsSource ฯลฯ ในคำถามเดิมของคุณ - person Filip Skakun; 05.10.2012
comment
บางที Database.Tag จากรายการใดรายการหนึ่งของคุณอาจไม่เท่ากับ Database.Tag ใด ๆ ในรายการอื่น คุณควรใช้ประเภทอื่นสำหรับโมเดลมุมมองรายการของคุณมากกว่าสิ่งที่คุณได้รับจากฐานข้อมูล - person Filip Skakun; 08.10.2012
comment
วัตถุมีความคล้ายคลึงกันทั้งสองด้านค่าเท่ากันที่ if ((Database.Tag)lvitem == item) - person Farhan Ghumra; 09.10.2012
comment
คล้ายกัน != เหมือนกัน คุณได้ติดตั้งตัวดำเนินการ Equals สำหรับประเภทนั้นแล้วหรือยัง? - person Filip Skakun; 09.10.2012
comment
มันคืนค่าเท็จ โปรดแนะนำวิธีแก้ปัญหาให้ฉันหน่อย - person Farhan Ghumra; 09.10.2012
comment
แทนที่ Equals เพื่อเปรียบเทียบคุณสมบัติที่ระบุว่ารายการเหมือนกัน - ไม่ว่าจะเป็น ID บางส่วนหรือคุณสมบัติทั้งหมด - person Filip Skakun; 09.10.2012
comment
ฉันได้แทนที่ Equals() แล้ว (ดูอัปเดต 3 ที่เป็นปัญหา) lvTags.SelectedItems กำลังมีเอนทิตี แต่มุมมองรายการไม่แสดงรายการที่เลือก - person Farhan Ghumra; 09.10.2012
comment
SelectedItems.Add() ได้รับการเรียกหรือไม่ - person Filip Skakun; 09.10.2012
comment
ใช่ lvTags.SelectedItems.Add(lvitem) ถูกเรียกและ lvTags.SelectedItems.Count ก็มากกว่าศูนย์เช่นกัน นั่นคือค่าการนับเท่ากับ MyList.Count ฉันขอแนะนำให้คุณให้โครงการตัวอย่างใด ๆ แก่ฉัน ฉันจะขอบคุณคุณมาก - person Farhan Ghumra; 09.10.2012
comment
ขออภัย ฉันหลงทางในเรื่องนี้เล็กน้อย ฉันคิดว่าคุณจะต้องแก้ไขโค้ดของคุณใหม่เพื่อรับไอเท็มต่างๆ เป็นไอเท็มโมเดลมุมมองและทำงานกับรายการที่ปรับแต่งสำหรับมุมมองของคุณ แทนที่จะอาศัยวัตถุที่มาจาก db.Table‹Database.Tag›() โดยตรง บางทีรายการที่คุณพยายามเพิ่มลงใน SelectedItems อาจไม่ใช่รายการเดียวกันกับที่กำหนดให้กับ ItemsSource - person Filip Skakun; 09.10.2012
comment
นั่นเป็นเหตุผลที่ฉันบอกคุณ โปรดให้โครงการตัวอย่าง อธิบายสถานการณ์ที่ฉันต้องการ ได้โปรดฉันต้องการคุณสมบัตินั้นสำหรับโครงการของฉัน - person Farhan Ghumra; 10.10.2012

ฉันลบคำตอบเดิมของฉันเนื่องจากคุณไม่ได้ใช้การผูกข้อมูลและคำตอบของฉันจะไม่เป็นประโยชน์กับคุณ

ฉันพบสิ่งนี้เมื่อกี้ซึ่งอาจเป็นประโยชน์กับคุณ:

"คุณสมบัติ SelectedItems เป็นแบบอ่านอย่างเดียว และไม่สามารถตั้งค่าได้โดยตรง"

ดังนั้น สำหรับวิธีแก้ปัญหาที่อาจให้ความช่วยเหลือ โปรดดูที่ บทความนี้

person Mamta D    schedule 04.10.2012
comment
ฉันไม่ได้ใช้ ListBoxItem แต่ละรายการ (หรือ GridViewItem) ฉันกำลังเชื่อมโยงแหล่งที่มาของรายการโดยตรงจากวิธี Query<T>() ของ SQLite - person Farhan Ghumra; 04.10.2012
comment
อัปเดตคำตอบของฉันตามความคิดเห็นของคุณ - person Mamta D; 04.10.2012
comment
ขอบคุณ แต่ฉันไม่ได้ใช้ MVVM แอปของฉันเรียบง่าย คุณช่วยกรุณาให้แอปสาธิตง่ายๆ ให้ฉันได้ไหม ซึ่งมีหลายรายการใน gridview และบางรายการในแอปที่เปิดอยู่จะถูกเลือก - person Farhan Ghumra; 04.10.2012