ปัญหาในการรีเฟรช ListView เมื่อฉันเพิ่มรายการจากหน้าต่างอื่น (ObservableCollection)

ฉันมีปัญหาในการเพิ่มรายการใน ListView จากหน้าต่างอื่น แต่ไม่มีการเพิ่มลงในรายการ ฉันกำลังพยายามเพิ่มรายการลงใน ListView ของฉันซึ่งอยู่ใน MainWindow ของฉันจากหน้าต่าง WindowTodAddANewBus และฉันเมื่อฉันเพิ่มรายการนั้น ฉันต้องการให้ MainWindow รีเฟรชโดยอัตโนมัติ

คำจำกัดความของรายการของฉันใน MainWindow.xaml.cs ด้วย ObservableCollection

public static List<Bus> buses = new List<Bus>();
public static ObservableCollection<Bus> myCollection { get; set; } = new ObservableCollection<Bus>(buses);

ในตัวสร้าง:

public MainWindow()
       {
           InitializeComponent();
           myListView.ItemsSource = buses;
       }

เมื่อฉันเพิ่มรายการใหม่ใน WindowToAddANewBus.xaml.cs

Bus b1 = new Bus(myLicenseNum, date);
MainWindow.myCollection.Add(b1);

ฉันไม่รู้ว่าฉันใช้ ObservableCollection ได้ดีหรือไม่

หากคุณสามารถช่วยฉันได้โปรด!! ขอบคุณ


person Elish    schedule 11.12.2020    source แหล่งที่มา
comment
นี่เป็นข้อเสนอแนะสำหรับตัวอย่างโค้ดของคุณโดยทั่วไป แต่คุณควรพิจารณาใช้บางอย่างเช่น MvvmLight และเชื่อมโยงกับโมเดลมากกว่าการตั้งค่าสิ่งต่าง ๆ ในโค้ดด้านหลัง มันจะทำให้สิ่งต่าง ๆ ง่ายขึ้นในระยะยาว   -  person Kevin Cook    schedule 11.12.2020


คำตอบ (1)


คุณต้องตั้งค่า ItemsSource เป็นคุณสมบัติ myCollection ของคุณ ไม่ใช่ buses

หากต้องการเพิ่มบริบท ObservableCollection จะ ไม่ แจ้งเตือนการเปลี่ยนแปลงในคอลเลกชันที่คุณส่งผ่านไปยังตัวสร้าง นี่เป็นเพียงวิธีในการวางโหลดของรายการภายในคอลเลกชันเมื่อสร้างมันขึ้นมา อย่างไรก็ตาม จะแจ้งเตือนการเปลี่ยนแปลงเมื่อมีการเปลี่ยนแปลงคอลเลกชัน (เช่น Add, Remove, Clear ฯลฯ) ด้วยเหตุนี้ ฉันไม่คิดว่าคุณไม่จำเป็นต้องมีคุณสมบัติ buses เลย คุณสามารถใช้คุณสมบัติ myCollection ของคุณได้

โดยพื้นฐานแล้วเปลี่ยน Constructor ของคุณเป็น:

public MainWindow()
{
    InitializeComponent();
    myListView.ItemsSource = myCollection;
}

การปรับปรุงแนวทางทั่วไปที่เป็นไปได้

หากต้องการขยายขอบเขตออกไปอีกเล็กน้อย คุณอาจต้องการหลีกเลี่ยงการใช้คุณสมบัติ static โดยสิ้นเชิง เนื่องจากสิ่งต่างๆ อาจทำให้ส่วนต่างๆ เหล่านี้เลอะเทอะได้ ฉันขอแนะนำให้ดูการส่งผ่านคุณสมบัติ myCollection ของคุณไปที่ WindowToAddANewBus เมื่อคุณสร้าง/แสดงมัน หรือควรให้คลาส WindowToAddANewBus นั้นส่งคืน Bus เมื่อปิดดีกว่า

person Bijington    schedule 11.12.2020
comment
โอเคขอบคุณ!! แต่ฉันจะแปลง ObservalCollection เป็นประเภท List ได้อย่างไรเพราะฉันมีฟังก์ชันนี้ที่รับ List‹Bus› เพื่อเริ่มต้นรายการของฉันด้วย 10 บัส หรือฉันต้องทำฟังก์ชันใหม่ InitializeBus(ObservableCollection myCollection) ? - person Elish; 11.12.2020
comment
@Elish คุณอาจเปลี่ยนประเภทในฟังก์ชันของคุณให้เป็น IEnumerable<Bus> แทนที่จะเป็น List<Bus> แม้ว่าจะเป็นการยากที่จะพูดอย่างแน่นอนโดยไม่เห็นฟังก์ชัน - person Bijington; 11.12.2020