मैं एक Xamarin ऐप को कोड कर रहा हूं और MVVM का पालन करने की पूरी कोशिश कर रहा हूं, जो मुझे वास्तव में पसंद है

मेरे पास आमतौर पर सामग्री पृष्ठ होते हैं जिनमें दृश्यों के संदर्भ होते हैं।

मैंने पृष्ठ में एक वीएम के लिए बाध्यकारी संदर्भ सेट किया है, और फिर दृश्य में OnBindingContextChanged का उपयोग करें

यह मुझे मेरे दृश्य के लिए तर्क स्थितियों को प्रदर्शित करने के लिए प्रतिक्रिया करने के लिए PropertyChanged विधि का उपयोग करने की अनुमति देता है

मैंने इसे कई बार सफलतापूर्वक उपयोग किया है लेकिन मैं चकित हूं कि एक अतिरिक्त कार्यान्वयन क्यों काम नहीं कर रहा है

पेज इस तरह दिखता है

public partial class BindingTextPage : ContentPage
{
    public BindingTextPage()
    {
        InitializeComponent();

        this.BindingContext = new ViewModels.LocationsViewModel();
    }
}

दृश्य इस तरह दिखता है

private LocationsViewModel_vm;

public BindingTestView()
{
    InitializeComponent();

    System.Diagnostics.Debug.WriteLine("Debug: Initialised BindingTesView view");

}

protected override void OnBindingContextChanged()
{
    System.Diagnostics.Debug.WriteLine("Debug: BindingTest: OnBindingContextChanged: Context " + this.BindingContext.GetType());

    _vm = BindingContext as LocationsViewModel;

    _vm.PropertyChanged += _vm_PropertyChanged;
}

private void _vm_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
    try
    {
        System.Diagnostics.Debug.WriteLine("Debug: BindingTest: Method called");
        System.Diagnostics.Debug.WriteLine("Debug: BindingTest: Property " + e.PropertyName);
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine("Debug: BindingTestView: Error changing context " + ex.Message);
    }
}

दृश्य मॉडल का एक्स्ट्रेक्ट, बहुत ही सरलता से इस मामले में एक स्ट्रिंग सेट करना और इसलिए एक संपत्ति को बदलना, जिसकी मुझे उम्मीद थी, उसके बाद प्रॉपर्टी चेंज में आग लग जाएगी?

public LocationsViewModel()
{
    tempMessage = "this is from the view model";
}

public string tempMessage
{
    get
    {
        return _tempMessage;
    }
    set
    {
        _tempMessage = value;
        OnPropertyChanged(nameof(tempMessage));
    }
}

बूट होने पर मेरे डिबग स्टेटमेंट से पता चलता है कि OnBindingContextChange को कॉल किया जा रहा है, लेकिन इस एक उदाहरण में _vm_PropertyChanged कभी आग नहीं लगाता है? मुझे उम्मीद है कि tempMessage ऐसा करने के लिए सेट किया जा रहा है?

0
Journeyman1234 23 जिंदा 2020, 13:55

1 उत्तर

सबसे बढ़िया उत्तर

आपके कोड में घटनाओं का क्रम निम्नलिखित है

  • LocationsViewModel के निर्माता को कहा जाता है
  • अपने कंस्ट्रक्टर से, आप tempMessage सेट कर रहे हैं
  • tempMessage का सेटर OnPropertyChanged कॉल करता है, क्योंकि इस समय ईवेंट null है, इसलिए इसे सक्रिय नहीं किया गया है
  • LocationsViewModel का कंस्ट्रक्टर बचा है
  • Page.BindingContext सेट है
  • OnBindingContextChanged कहा जाता है
  • LocationsViewModel.PropertyChanged को आपके पेज ने सब्सक्राइब किया है

चूंकि आपके पृष्ठ की सदस्यता लेने से पहले घटना को उठाया जाता है (या इसे करने की कोशिश की जाती है), आपके पृष्ठ को घटना के बारे में सूचित नहीं किया जाता है। यदि आप ईवेंट की सदस्यता लेने के बाद मान सेट करते हैं, तो हैंडलर को अपेक्षित रूप से बुलाया जाएगा।

जैसे

protected override void OnBindingContextChanged()
{
    _vm = BindingContext as LocationsViewModel;

    _vm.PropertyChanged += _vm_PropertyChanged;

    _vm.tempMessage = "Hello, world!"; // clichée , I know
}
2
Paul Kertscher 23 जिंदा 2020, 14:14