سؤال

لدي الرأي الذي يظهر مربع القائمة الذي لا بد أن GetAll():

<DockPanel>
    <ListBox ItemsSource="{Binding GetAll}"
             ItemTemplate="{StaticResource allCustomersDataTemplate}"
             Style="{StaticResource allCustomersListBox}">
    </ListBox>
</DockPanel>

GetAll() هو ObservableCollection الملكية في ViewModel:

public ObservableCollection<Customer> GetAll
{
    get
    {
        return Customer.GetAll();
    }
}

والذي بدوره يدعو GetAll() نموذج الأسلوب الذي يقرأ ملف XML لملء ObservableCollection.:

public static ObservableCollection<Customer> GetAll()
{
    ObservableCollection<Customer> customers = new ObservableCollection<Customer>();

    XDocument xmlDoc = XDocument.Load(Customer.GetXmlFilePathAndFileName());
    var customerObjects = from customer in xmlDoc.Descendants("customer")
                          select new Customer
                          {
                              Id = (int)customer.Element("id"),
                              FirstName = customer.Element("firstName").Value,
                              LastName = customer.Element("lastName").Value,
                              Age = (int)customer.Element("age")
                          };
    foreach (var customerObject in customerObjects)
    {
        Customer customer = new Customer();

        customer.Id = customerObject.Id;
        customer.FirstName = customerObject.FirstName;
        customer.LastName = customerObject.LastName;
        customer.Age = customerObject.Age;

        customers.Add(customer);
    }

    return customers;
}

كل هذا يعمل بشكل جيد إلا عندما يذهب المستخدم إلى رأي آخر ، التعديلات على ملف XML ويعود إلى هذا الرأي حيث البيانات القديمة لا يزال يظهر.

كيف يمكنني أن أقول هذا الرأي إلى "تحديث الارتباطات" بحيث يظهر البيانات الفعلية.

فإنه يشعر وكأنه أنا ذاهب عن WPF هنا مع الكثير من HTML/HTTP المجاز ، أشعر أن هناك طريقة أكثر طبيعية للحصول على ObservableCollection إلى تحديث نفسها, ومن هنا اسمها, ولكن هذه هي الطريقة الوحيدة التي يمكنني الحصول على المستخدم أن يكون قادرا على تحرير البيانات في تطبيق WPF في هذه اللحظة.حتى تساعد على أي مستوى هو محل تقدير هنا.

هل كانت مفيدة؟

المحلول

وهو ItemsControl طلبات ملزمة لها مرة واحدة و مخابئ الإشارة بعد ذلك.

إذا كان المحتوى من كائن مجموعة يتم تعديل و تنفذ INotifyCollectionChanged (كما ObservableCollection لا), أنها سوف التقاط أي إضافة أو إزالة الكائن.

الآن, إذا كنت تريد ربط توريد مجموعة جديدة كائن إلى ListBox, هل يمكن أن يكون عرض نموذج تنفيذ INotifyPropertyChanged ورفع PropertyChanged, يمر في GetAll مثل اسم الخاصية.هذا سوف يكون له تأثير تحذير ملزم أن قيمة العقار قد تغير (هناك جديد ObservableCollection على استعداد أن يتم انتقاؤها) ، والتي سوف نورد إلى ListBox, والتي سوف إعادة توليد بنوده.

لذلك طالما أنك تأثير التغييرات من التطبيق الخاص بك ، والعمل على ObservableCollection عاد قبل GetAll, يمكنك إضافة وإزالة و القائمة ستبقى في التوافق.عندما تريد التقاط تعديلات خارجية (قد يكون لديك زر التحديث في مكان ما ، أو الطبيعية النقطة حيث أنه من المنطقي أن تحميل الملف بأكمله), هل يمكن أن يكون عرض نموذج رفع PropertyChanged الحدث الذي سوف تلقائيا الاتصال بمكان الإقامة جالبة التي سيتم استدعاء أسلوب ثابت ، الذي سيعود من جديد مجموعة جديدة.

Nitpicker ملاحظة:لماذا تعطي طريقة أسماء الخصائص ؟

نصائح أخرى

تحت خط العمل نفسه كما هو الحال عندما كنا إزالة لإضافة كائن في مجموعة:

CollectionViewSource.GetDefaultView(CustomObservableCollection).Refresh();

تبقى الإشارة إلى ObservableCollection و ملف XML الأخير-تعديل الوقت وقت تحميله.كلما يحصل نافذة التركيز التحقق من الطابع الزمني على ملف القرص.إذا كان هناك تغير واضح و إعادة تعبئة ObservableCollection.واجهة المستخدم الرسومية تلقائيا الاستماع من أجل أحداث التغيير من ObservableCollection و سيتم إعادة ملء تلقائيا عند تعديل مجموعة المحتويات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top