2010-03-30 7 views
9

सेट किए बिना टॉगलबटन को टॉगल होने से कैसे रोक सकता है मेरे पास सूची बॉक्स के मल्टी सिलेक्ट मोड का उपयोग करके this answer के समान सूची बॉक्स में आइटम टेम्पलेट के रूप में टॉगलबूटन की एक सूची है। हालांकि मुझे यह सुनिश्चित करने की ज़रूरत है कि कम से कम एक आइटम हमेशा चुना जाता है।IsEnabled

मैं लिस्टबॉक्स पर सूची बॉक्स पर चयनित बॉक्स में केवल एक आइटम जोड़कर सूची बॉक्स से उचित व्यवहार प्राप्त कर सकता हूं। चयन परिवर्तन घटना लेकिन मेरा टॉगलबटन अभी भी अपने टॉगल किए गए राज्य से बाहर निकलता है, इसलिए मुझे लगता है कि मुझे इसे पहले रोकने की ज़रूरत है प्रक्रिया।

मैं इसे अंतिम बटन पर IsEnabled = "गलत" सेटिंग के बिना करना चाहता हूं क्योंकि मैं अपने बटन टेम्पलेट को दोबारा बिना सक्षम दृश्य शैली के साथ रहना पसंद करूंगा। कोई विचार?

उत्तर

28

आप राज्य टॉगल, आधार कार्यान्वयन ना बुलाने से रोकने के लिए OnToggle विधि ओवरराइड कर सकते हैं:

public class LockableToggleButton : ToggleButton 
{ 
    protected override void OnToggle() 
    { 
     if (!LockToggle) 
     { 
      base.OnToggle(); 
     } 
    } 

    public bool LockToggle 
    { 
     get { return (bool)GetValue(LockToggleProperty); } 
     set { SetValue(LockToggleProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for LockToggle. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty LockToggleProperty = 
     DependencyProperty.Register("LockToggle", typeof(bool), typeof(LockableToggleButton), new UIPropertyMetadata(false)); 
} 
+0

धन्यवाद। मैं इसे आज़मा दूंगा। –

+3

ग्रेट समाधान। – Ross

1

hackey यह वह जगह है, लेकिन यदि आप कस्टम कोड नहीं करना चाहती आप हमेशा संपत्ति "इस्तेमाल कर सकते हैं IsHitTestVisible ", जब आप उन्हें अनचेक नहीं करना चाहते हैं, तो बस IsHitTestVisible को झूठी के बराबर सेट करें। हालांकि, वे नियंत्रण में टैब कर सकते हैं और स्पेस बार का उपयोग करके इसे टॉगल कर सकते हैं।

+0

जब उपयोगकर्ता लॉक होने पर इसे टॉगल करने का प्रयास करता है तो श्रव्य * डिंग * ध्वनि बनाना भी वांछनीय हो सकता है। IsHitTestVisible का उपयोग करने से कोई इसे प्राप्त करने की अनुमति नहीं देगा। – jpierson

+0

आप उपयोगकर्ता को टैबबिंग से बटन पर रखने के लिए 'IsTabStop =" गलत "का उपयोग कर सकते हैं। मैं स्वीकार्य उत्तर पर इस समाधान को प्राथमिकता देता हूं क्योंकि इसे एक्सएएमएल में सही किया जा सकता है, एमवीवीएम अनुकूल है, और किसी भी कस्टम कोड की आवश्यकता नहीं है। यदि आपको इसे कई स्थानों पर लागू करने की आवश्यकता है तो एक शैली का उपयोग किया जा सकता है। –

3

क्या आपने इसके बजाय रेडियोबूटन का उपयोग करने की कोशिश की है? इसे सामान्य रूप से किसी अन्य को चुने बिना अचयनित नहीं किया जा सकता है। यह भी एक ToggleButton तरह देखने के लिए स्टाइल जा सकता है:

<RadioButton Style="{StaticResource {x:Type ToggleButton}}"/> 

या, यदि आप पहले से ही इसके लिए एक Style है, बस इसे BasedOn="{x:Type ToggleButton}" बनाते हैं। ध्यान दें कि विजुअल स्टूडियो संपादक पहले मामले में एक त्रुटि दिखाता है, लेकिन यह संकलित करता है और ठीक काम करता है।

1

थॉमस का उत्तर ठीक काम करता है, लेकिन आपको अतिरिक्त निर्भरता संपत्ति की भी आवश्यकता नहीं है। यदि आपके पास ToggleButton से क्लास का उत्तराधिकारी है तो आपका बटन सही तरीके से अपडेट हो जाएगा ताकि आप ऑनटॉगल विधि को ओवरराइड कर सकें, और आप ViewModel पर Ischecked bound property को बदल सकते हैं।

Xaml:

<myControls:OneWayFromSourceToTargetToggle x:Name="MyCustomToggleButton" 
              Command="{Binding Path=ToggleDoStuffCommand}" 
              CommandParameter="{Binding RelativeSource={RelativeSource Mode=Self}}" 
              IsChecked="{Binding Path=ToggleIsCheckedConditionVar, 
                   Mode=OneWay}" 
              /> 

जोड़ा गया ToggleButton कक्षा:

public class OneWayFromSourceToTargetToggle : ToggleButton 
{ 
    /// <summary> 
    /// Overrides the OnToggle method, so it does not set the IsChecked Property automatically 
    /// </summary> 
    protected override void OnToggle() 
    { 
     // do nothing 
    } 
} 
तो सही या गलत का ViewModel सिर्फ सेट bool ToggleIsCheckedCondition में

। ऐसा करने का यह एक अच्छा तरीका है क्योंकि आप अच्छे एमवीवीएम प्रथाओं का पालन कर रहे हैं।

ViewModel:

public bool ToggleIsCheckedCondition 
{ 
    get { return _toggleIsCheckedCondition; } 
    set 
    { 
     if (_toggleIsCheckedCondition != value) 
     { 
     _toggleIsCheckedCondition = value; 
     NotifyPropertyChanged("ToggleIsCheckedCondition"); 
     } 
    } 
} 

public ICommand ToggleDoStuffCommand 
{ 
    get { 
     return _toggleDoStuffCommand ?? 
       (_toggleDoStuffCommand = new RelayCommand(ExecuteToggleDoStuffCommand)); 
     } 
} 

private void ExecuteToggleDoStuffCommand(object param) 
{ 
    var btn = param as ToggleButton; 
    if (btn?.IsChecked == null) 
    { 
     return; 
    } 
    // has not been updated yet at this point 
    ToggleIsCheckedCondition = btn.IsChecked == false; 

    // do stuff 

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

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