2016-04-11 19 views
1

'un devre dışı bırakılmasından ve etkinleştirilmesinden sonra çalışmamayı kontrol et KomboBox'ım var ve bir CheckBox'a dayanarak etkinleştiriyorum. Kodun arkasındaki onay kutusunu devre dışı bırakıp etkinleştirirseniz, çalışmayı durdurur. Ancak bunu yapmazsam, onay kutusu işaretlendiğinde ComboBox etkinleşir ve onay kutusu işaretlenmediğinde devre dışı kalır. AşağıdaWPF CheckBox

Kod örnek:

<CheckBox x:Name="ckBox1" IsChecked="{Binding proceed, TargetNullValue=false}" Content="Proceed" FontSize="16"/> 

ComboxBox:

<ComboBox x:Name="cmbOptions" SelectedValuePath="Content" SelectedValue="{Binding selOptions}" Width="89" IsEnabled="{Binding IsChecked, ElementName=ckBox1}" > 
             <ComboBoxItem Content="Option 1"/> 
             <ComboBoxItem Content="Option 2"/> 
             <ComboBoxItem Content="Option 3"/> 
             <ComboBoxItem Content="Other"/> 
            </ComboBox> 

Diabling:

var controls = this.sourceGrid.Children.OfType<Control>(); 
controls.ToList().ForEach(c => c.IsEnabled = false); 

etkinleştirme:

controls.ToList().ForEach(c => c.IsEnabled = true); 
+0

'Mode = OneWay' denediniz mi? –

+1

Bize kodu arkamızda gösterebilir misin? –

+0

Arkadaki kodda neler değişiyorsunuz? Özellik "devam" veya ckBox1.Enabled özelliği? – Shamshiel

cevap

0

Tamam, bu güzel bir çözüm değil, ihtiyacınız olanı yapmanıza izin vermeli. Temel olarak, IsEnabled öğesini false değerine ayarlamadan önce varolan Binding nesnesine bir başvuru yapmanız gerekir. Daha sonra, IsEnabled öğesini false değerine ya da true durumuna getirdikten sonra, bağlamayı sıfırlayın. Yüklü olay işleyicisinde belirttiğim tam kod ancak ihtiyacınız olan yere gidin.

this.Loaded += (s, e) => 
    { 
     var controls = this.sourceGrid.Children.OfType<Control>(); 
     controls.ToList().ForEach(c => 
     { 
      ComboBox combo = c as ComboBox; 
      Binding newBinding = null; 
      if (combo != null) 
      { 
       newBinding = BindingOperations.GetBinding(combo, ComboBox.IsEnabledProperty); 
      } 

      c.IsEnabled = false; 

      if (combo != null) 
      { 
       BindingOperations.SetBinding(combo, ComboBox.IsEnabledProperty, newBinding); 
      } 
     }); 

     controls.ToList().ForEach(c => 
     { 
      ComboBox combo = c as ComboBox; 
      Binding newBinding = null; 
      if (combo != null) 
      { 
       newBinding = BindingOperations.GetBinding(combo, ComboBox.IsEnabledProperty); 
      } 

      c.IsEnabled = true; 

      if (combo != null) 
      { 
       BindingOperations.SetBinding(combo, ComboBox.IsEnabledProperty, newBinding); 
      } 
     }); 
    }; 

Bu kod oldukça yüzden kendi uygulanması gereği düzgün planı ayrı lütfen olmadığını vurgulamak gerekir.

0

Denetimlerinizi devre dışı bırakmak ve etkinleştirmek için herhangi bir kod arkasına gerek yoktur. XAML'de yap. false bir tablo içinde IsEnabled özelliğinin ayarlanması

<Checkbox x:Name="enablingCheckBox" Content="Enabled?" IsChecked="{Binding IsEnabled}"/> 
<Grid IsEnabled="{Binding IsEnabled, Mode=OneWay, ElementName=enablingCheckBox}"> 
    <Button Content="Sample"/> 
    <ComboBox/> 
</Grid> 

otomatik olarak o şebekeye ait olan tüm kontrolleri devre dışı bırakır.

+0

Sorun, tüm ızgarayı değil, yalnızca belirli denetimleri devre dışı bırakmam gerekmez. – zulq

+0

Ardından, bu denetimlerin '' IsEnabled' özelliği üzerindeki bağlamayı ayarlayın. – dymanoid

+0

IsEnable, birçok denetime ve diğer mantığa bağlıdır. – zulq