कैसे उपयोग करने के लिए RX नियंत्रित करने के लिए आदेश की उपलब्धता में जटिल परिदृश्यों?

0

सवाल

सेटअप

चलो मान लेते हैं निम्नलिखित. हम निम्नलिखित सैद्धांतिक viewmodel वर्ग के लिए WPF अनुप्रयोग:

public MyViewModel
{

    public MyViewModel()
    {
        // Condition under which this command may be executed is:
        // this.ActiveDocument.Highlighting.Type == Highlighting.Xml && 
        //    !this.ActiveDocument.IsReadOnly && 
        //    (this.License.Kind == LicenseKind.Full || this.License.TrialDay < 30)
        MyCommand = new Command(obj => DoSomething());
    }

    public ICommand MyCommand { get; } 
    // (all other required properties)
}

इसके अलावा:

  • वर्तमान वर्ग को लागू करता है ठीक से INotifyPropertyChanged
  • सभी कक्षाओं में सदस्य पहुँच चेन ठीक से लागू करता है INotifyPropertyChanged (उदाहरण के लिए । दस्तावेज़ viewmodel से सुलभ ActiveDocument संपत्ति)
  • ActiveDocument हो सकता है null. ActiveDocument.Highlighting भी हो सकता है null.

समस्या

मैं आदेश करने के लिए सक्षम हो जाएगा केवल जब हालत में टिप्पणी से मुलाकात की है ।

विकल्प के बिना RX

मैं ने लिखा है मेरी खुद के पुस्तकालय के लिए ऐसी स्थितियों से निपटने. समाधान के लिए किया जाएगा या तो:

public MyViewModel
{
    private readonly Condition commandAvailableCondition;

    public MyViewModel()
    {
        commandAvailableCondition = new LambdaCondition(this, 
            vm => m.ActiveDocument.Highlighting.Type == Highlighting.Xml && 
                !vm.ActiveDocument.IsReadOnly && 
                (vm.License.Kind == LicenseKind.Full || vm.License.TrialDay < 30),
            false);

        MyCommand = new AppCommand(obj => DoSomething(), commandAvailableCondition);
    }

    public ICommand MyCommand { get; } 
    // (all other required properties)
}

या - यदि आप चाहते हैं कोड हो सकता है एक थोड़ा और अधिक पठनीय, इसलिए है कि आंशिक स्थिति पुन: उपयोग किया जा सकता है - जैसे कि:

public MyViewModel
{
    private readonly Condition commandAvailableCondition;

    public MyViewModel()
    {
        var highlightingIsXml = new LambdaCondition(this, 
            vm => vm.ActiveDocument.Highlighting.Type == Highlighting.Xml, 
            false);
        var documentIsReadonly = new LambdaCondition(this,
            vm => vm.ActiveDocument.IsReadOnly, 
            false);
        var appIsLicensed = new LambdaCondition(this,
            vm => vm.License.Kind == LicenseKind.Full || this.License.TrialDay < 30,
            false);

        commandAvailableCondition = highlightingIsXml & !documentIsReadonly & appIsLicensed;

        MyCommand = new AppCommand(obj => DoSomething(), commandAvailableCondition);
    }

    public ICommand MyCommand { get; } 
    // (all other required properties)
}

क्या मेरे पुस्तकालय (या, और अधिक ठीक, LambdaCondition वर्ग) करता है:

  • यह का ट्रैक रखता है सभी उदाहरणों को लागू करने INotifyPropertyChanged और परिवर्तन को संभालने के लिए (जैसे. जब ActiveDocument परिवर्तन या ActiveDocument.Highlighting परिवर्तन या ActiveDocument.Highlighting.Type परिवर्तन, आदि.)
  • यह का ट्रैक रखता है संभव nullएस के रास्ते पर है, जो मामले में यह वापसी करेंगे डिफ़ॉल्ट मूल्य (इस मामले में, false)
  • यह स्वचालित रूप से परिवर्तन की रिपोर्ट (लेकिन केवल परिवर्तन) की उपलब्धता के लिए आदेश में, इतना है कि यूआई हो सकता है जब ताजा की जरूरत है ।

सवाल

कैसे एक को लागू करेगा परिदृश्य के ऊपर वर्णित का उपयोग कर System.Reactive सी# में? क्या यह संभव है यह करने के लिए आसानी से जबकि रखते हुए सभी आवश्यकताओं के बारे में INotifyPropertyChanged, nulls रास्ते पर और डिफ़ॉल्ट मूल्य है? आप कर सकते हैं किसी भी समझदार मान्यताओं जब की जरूरत है.

c# mvvm system.reactive wpf
2021-11-23 15:15:48
1

सबसे अच्छा जवाब

0

के ReactiveUI ढांचे है ReactiveCommand वर्ग का उपयोग करता है कि एक IObservable<T> ताज़ा करने की स्थिति कमांड (यानी बढ़ा CanExecuteChanged घटना के ICommand).

कृपया देखें करने के लिए डॉक्स के लिए कैसे का एक उदाहरण का उपयोग यह नियंत्रित करने के लिए executability:

var canExecute = this.WhenAnyValue(
    x => x.UserName, x => x.Password,
    (userName, password) => 
        !string.IsNullOrEmpty(userName) && 
        !string.IsNullOrEmpty(password));

var command = ReactiveCommand.CreateFromTask(LogOnAsync, canExecute);
2021-11-24 14:52:33

यह पालन करता है INotifyPropertyChange कार्यान्वयनकर्ताओं में संपत्ति का उपयोग श्रृंखला? यह भी ठीक से काम अगर किसी के गुण रिक्त है? आप दिखाने के लिए, कैसे अपने विशिष्ट उदाहरण के लिए जब देखो में लागू RX?
Spook

WhenAnyValue करता है फेंकना एक नए मूल्य के किसी भी Username और Password गुण rasises के PropertyChanged घटना है. क्या है आपकी विशिष्ट उदाहरण बताएंगे? क्या आप की कोशिश की?
mm8

क्या आप पढ़ने के लिए अपने पूरे सवाल है? मैं प्रस्तुत किया है सही हालत में माना जाता है, जो देखा जा करने के लिए: vm => m.ActiveDocument.Highlighting.Type == Highlighting.Xml && !vm.ActiveDocument.IsReadOnly && (vm.License.Kind == LicenseKind.Full || vm.License.TrialDay < 30), क्या होगा अगर उदाहरण के लिए । ActiveDocument अशक्त है? जाएगा RX इसे ठीक से संभाल? मुझे उम्मीद है इस मामले में शर्त करने के लिए अपने डिफ़ॉल्ट मूल्य (या कम से कम डिफ़ॉल्ट रूप से false)
Spook

अगर ActiveDocument, आप मिल जाएगा एक NullReferenceException. इस के साथ कुछ नहीं करना RX.
mm8

मेरे पुस्तकालय में मैं नहीं होगा. है कि, दूसरों के बीच में, क्यों मैं दिलचस्पी रहा हूँ, चाहे RX अच्छी तरह से अनुकूल है इस कार्य के लिए.
Spook

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में