सेटअप
चलो मान लेते हैं निम्नलिखित. हम निम्नलिखित सैद्धांतिक 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 रास्ते पर और डिफ़ॉल्ट मूल्य है? आप कर सकते हैं किसी भी समझदार मान्यताओं जब की जरूरत है.