मैंने हाल ही में सी # में एमवीवीएम के साथ चक्कर लगाया है और मैं उस बिंदु पर पहुंच गया जहां मैंने सोचा कि मैं समझ गया कि बाइंडिंग कैसे काम करती है लेकिन फिर ऐसा हुआ ...

using System;
using System.Collections.Generic;
using System.Text;

namespace API
{
    public class ApiViewModel : BaseViewModel
    {
        public bool CustomerIsChecked { get; set; }

        public bool StorageIsChecked { get; set; }

        public bool ArticlesIsChecked { get; set; }


        public bool Transfer()
        {
            if(CustomerIsChecked == true)
            {
                return true; 
            }
            return false;
        }
        public override string ToString()
        {
            return Transfer().ToString(); 
        }
    }
}

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using PropertyChanged; 

namespace API
{
    [AddINotifyPropertyChangedInterface]
    public class BaseViewModel : INotifyPropertyChanged
    {

        public event PropertyChangedEventHandler PropertyChanged = (sender, e) => { };

    }
}

यह काम करता है अगर मुझे सीधे बाध्यकारी में एक स्ट्रिंग या कुछ भी भेजना पसंद है लेकिन जब मैं स्थानांतरण के मूल्य में भेजने की कोशिश करता हूं तो यह काम नहीं करता है यह मुझे एक खाली बटन देता है यह क्यों है? मेरा सवाल यह है कि जब आप किसी भी पैरामीटर या किसी भी चीज़ के बिना स्ट्रिंग का उपयोग कर रहे हैं तो यह मूल रूप से quz काम क्यों नहीं करता है और केवल गेटटर या सेटर काम करता है लेकिन एक स्ट्रिंग में भेजने के लिए जिसमें यह नहीं है? ऐसा क्यों है?

0
user12609036 17 जिंदा 2020, 22:40

1 उत्तर

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

आपको () को Transfer विधि के पीछे से हटा देना चाहिए:

public class ApiViewModel : BaseViewModel
{
    public bool CustomerIsChecked { get; set; }

    public bool StorageIsChecked { get; set; }

    public bool ArticlesIsChecked { get; set; }


    public bool Transfer  // <- remove ()
    {
        get   // it should have a getter.
        {
            if(CustomerIsChecked == true)
            {
                return true; 
            }
            return false;
        }
    }
    public override string ToString()
    {
        return Transfer().ToString(); 
    }
}

Transfer के कोड को सरल बनाया जा सकता है। जब CustomerIsChecked सत्य हो, अन्यथा असत्य होने पर इसे वापस लौटना चाहिए।

इसलिए:

public bool Transfer
{
    get => CustomerIsChecked;
}

मेरा पुराना उत्तर (मुझे प्रश्न समझ में नहीं आया)

आपको INotifyPropertyChanged को लागू करना चाहिए और उसे ईवेंट बढ़ाना चाहिए। बहुत बुरा आपको एक पूर्ण संपत्ति की आवश्यकता है (एक फ़ील्ड जोड़ें)

चूंकि आप केवल उस वर्ग से ही किसी ईवेंट का आह्वान कर सकते हैं, इसलिए आपको बेस क्लास में ईवेंट को बढ़ाने के लिए एक विधि लागू करने की आवश्यकता है।

उदाहरण के लिए:

public class BaseViewModel : INotifyPropertyChanged
{
    protected void RaisePropertyChanged(string propertyName) =>
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

    public event PropertyChangedEventHandler PropertyChanged;

}

public class ApiViewModel : BaseViewModel
{
    private bool _customerIsChecked;

    public bool CustomerIsChecked
    {
        get { return _customerIsChecked; }
        set
        {
            _customerIsChecked = value;
            RaisePropertyChanged(nameof(CustomerIsChecked));
        }
    }
}

एक सहायक विधि बनाना भी संभव है जो बदली गई संपत्ति का ख्याल रखता है।

मुझे यह शैली पसंद है जो नए अभिव्यक्ति-शरीर वाले सदस्य को अनुमति देती है,

public class BaseViewModel : INotifyPropertyChanged
{
    public bool SetField<T>(ref T field, T value, [CallerMemberName] string memberName = "")
    {
        if (field != null)
        {
            if (field.Equals(value))
                return false;
        }
        else if (value != null)
            return false;

        field = value;
        RaisePropertyChanged(memberName);
        return true;
    }

    protected void RaisePropertyChanged(string propertyName) =>
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

    public event PropertyChangedEventHandler PropertyChanged;

}

public class ApiViewModel : BaseViewModel
{
    private bool _customerIsChecked;

    public bool CustomerIsChecked
    {
        get => _customerIsChecked;
        set => SetField(ref _customerIsChecked, value);
    }
}
0
Jeroen van Langen 17 जिंदा 2020, 23:20