2012-01-28 8 views
6

मैं कैसे नियंत्रण के IsEnabled संपत्ति के लिए Caliburn.Micro के लिए एक कस्टम सम्मेलन में शामिल कर सकता करने के लिए IsEnabled के लिए एक सम्मेलन जोड़ना - NameEnabledName किसी पाठ बॉक्स पर Text करने के लिए बाध्य करने के लिए समानांतर में IsEnabled करने के लिए बाध्य होने की तरह कुछ।Caliburn.Micro

एक तरह से, मैं जो हासिल करना चाहता हूं वह CanSave प्रॉपर्टी का उपयोग Save विधि से बाध्य बटन को सक्षम/अक्षम करने के लिए किया जा सकता है, लेकिन सभी नियंत्रणों के लिए सामान्य है।

उत्तर

12

कैलिबर्न। माइक्रो अभी (1.3.1) वास्तव में आपके द्वारा वर्णित FrameworkElement के लिए इस "एकाधिक" सम्मेलनों का समर्थन नहीं करता है।

संपादित:

हालांकि आप ViewModelBinder.BindProperties विधि में हुक कर सकते हैं और वहाँ आप अपने खुद के अतिरिक्त convetion लागू कर सकते हैं।

मैं एक कदम आगे चला गया और एक प्रोटोटाइप जो काम करता है लागू किया, लेकिन यह मजबूत, और न ही सुंदर और शायद नहीं सही तरीका यह करने के लिए नहीं है।

static AppBootstrapper() 
{ 
    ConventionManager.AddElementConvention<FrameworkElement>(
     UIElement.IsEnabledProperty, 
     "IsEnabled", 
     "IsEnabledChanged"); 
    var baseBindProperties = ViewModelBinder.BindProperties; 
    ViewModelBinder.BindProperties = 
     (frameWorkElements, viewModels) => 
     { 
      foreach (var frameworkElement in frameWorkElements) 
      { 
       var propertyName = frameworkElement.Name + "Enabled"; 
       var property = viewModels 
        .GetPropertyCaseInsensitive(propertyName); 
       if (property != null) 
       { 
        var convention = ConventionManager 
         .GetElementConvention(typeof(FrameworkElement)); 
        ConventionManager.SetBindingWithoutBindingOverwrite(
         viewModels, 
         propertyName, 
         property, 
         frameworkElement, 
         convention,           
         convention.GetBindableProperty(frameworkElement)); 
       } 
      } 
      return baseBindProperties(frameWorkElements, viewModels); 
     }; 
} 
+0

एक अपेक्षाकृत दर्दरहित की तरह लगता है लेकिन यह एक प्रारंभिक बिंदु हो सकता है अंतिम परिणाम प्राप्त करने का तरीका मैं चाहता हूं - हालांकि मुझे वास्तव में आश्चर्य हुआ है कि कैलिबर्न माइक्रो को इस तरह की चीज़ के लिए स्पष्ट समर्थन नहीं है, क्योंकि 'आईईएनएबल' और 'आईएसआरडऑनली' के लिए बाइंडिंग यूआई में काफी आम है। [मैंने माना कि मेरा GoogleFu गलती में था जब मुझे खुद को कोई जवाब नहीं मिला।] – Bevan

+1

मैंने अपना समाधान अपडेट कर दिया है क्योंकि मूल व्यक्ति ने डिफ़ॉल्ट सम्मेलनों को मार दिया :) अब यह आपके नमूने के साथ भी काम करता है 'टेक्स्टबॉक्स नाम = "नाम "/>' बाइंडिंग्स: टेक्स्ट-> संपत्ति: 'नाम' और IsEnabled -> संपत्ति 'नाम सक्षम'। – nemesv

+0

@ जुआनगुई अपडेट के लिए धन्यवाद। मुझे नहीं पता था कि एपीआई संस्करण 1.3.1 – nemesv

-4

आप सक्षम कर सकते हैं/अपने ViewModel में एक बूलियन संपत्ति की स्थापना द्वारा एक नियंत्रण को अक्षम और तुम सिर्फ XAML में IsEnabled करने के लिए बाध्य:

TextBox Name="SerialNumber" IsEnabled="{Binding IsReadOnly}"... 

ViewModel: 
    private bool isReadOnly; 
    public bool IsReadOnly 
    { 
     get { return isReadOnly; } 
     set 
     { 
      this.isReadOnly = value; 
      NotifyOfPropertyChange(() => IsReadOnly); 
     } 
    } 
+4

निश्चित रूप से, लेकिन अगर मैं मैन्युअल रूप से अपना सभी सेट अप करना चाहता था बाध्यकारी मैं कैलिबर्न का उपयोग नहीं करूँगा। माइक्रो पहले स्थान पर। – Bevan

संबंधित मुद्दे

 संबंधित मुद्दे