2011-02-09 22 views
6

Başka bir ComboBox'ta seçilmiş bir öğe varsa, bir ComboBox'u etkinleştirmek/devre dışı bırakmak istiyorum. Stil üzerinde bir tetikleyici belirleyerek çalışmayı başarabiliyordum, ancak bu, açılan kutu için özel genel stilimi geçersiz kılıyor. Tarzımı kaybetmeden aynı işlevselliği elde etmenin başka bir yolu var mı?Set IsEnabled Özelleştirilmiş ComboBox Özelliği SelectedItem

<ComboBox Grid.Column="1" Grid.Row="1" 
       Name="AnalysisComboBox" 
       MinWidth="200" 
       VerticalAlignment="Center" HorizontalAlignment="Left" 
       ItemsSource="{Binding Path=AvailableAnalysis}"> 

     <ComboBox.Style> 
      <Style TargetType="{x:Type ComboBox}"> 
       <Setter Property="IsEnabled" Value="True" /> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding SelectedItem,ElementName=ApplicationComboBox}" Value="{x:Null}"> 
         <Setter Property="IsEnabled" Value="False" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ComboBox.Style> 
    </ComboBox> 
+0

FWIW, Bunu bir stil ile çalıştım ve bunu dönüştürücüye tercih ediyorum çünkü hepsi XAML'de. Tetik aktif olmadığında, IsEnabled'ın doğru olması için bir ayarlayıcıya ihtiyacım yoktu. Bunu, bu soruyla karşılaşan başkaları için gönderiyorum, böylece bir stil ile yapılamayacağı izlenimini edinmiyorlar. – Kohanz

cevap

9

, sen IsEnabled özelliği bağlayabilirsiniz NullToFalseConverter followsing dönüştürücü örneğine bir anahtardır

<ComboBox Grid.Column="1" Grid.Row="1" 
       Name="AnalysisComboBox" 
       MinWidth="200" 
       VerticalAlignment="Center" HorizontalAlignment="Left" 
       IsEnabled={Binding SelectedItem, ElementName=ApplicationComboBox, Converter={StaticResource NullToFalseConverter}}" 
       ItemsSource="{Binding Path=AvailableAnalysis}"/> 

:

public class NullToFalseConverter: IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return value == null; 
    } 

    public object ConvertBack(object value, Type targetType, 
     object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

NullToFalseConverter'a düzgün bir şekilde çalışması için bağlanılamıyor gibi görünmüyor. Bir istisna almaya devam ediyorum: "NullToFalseConverter" adlı kaynak bulunamıyor. Kaynak adları büyük/küçük harfe duyarlıdır. ". Yardım et? Maalesef, WPF'ye oldukça yeni geldim: -/ – KrisTrip

+3

@KrisTrip Aslında bir yerdeki Dönüştürücünün bir örneğini bildirmeniz gerekiyor. @ColinE'nin bir "StaticResource" olarak başvurduğunu unutmayın. Bu, ComboBox'unuzu içeren herhangi bir şeyin Kaynak koleksiyonunda bir girişe ihtiyacınız olduğu anlamına gelir: ' ' –

+3

Dönüştürücünün uygulanmasının yanlış olduğunu düşünüyorum, ve bir örneği bildirmek gerekli değil. En azından bir tane yok ve işe yarıyor. – steffan

5

Evet, küresel tarzı "miras" için BasedOn niteliğini ayarlayabilirsiniz: (Bu örtülü değilse) Eğer küresel stilin anahtarı ayarlayabilirsiniz

<ComboBox Grid.Column="1" Grid.Row="1" 
      Name="AnalysisComboBox" 
      MinWidth="200" 
      VerticalAlignment="Center" HorizontalAlignment="Left" 
      ItemsSource="{Binding Path=AvailableAnalysis}"> 
    <ComboBox.Style> 
     <Style TargetType="{x:Type ComboBox}" 
       BasedOn="{StaticResource {x:Type ComboBox}}"> 
      <Setter Property="IsEnabled" Value="True" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding SelectedItem,ElementName=ApplicationComboBox}" Value="{x:Null}"> 
        <Setter Property="IsEnabled" Value="False" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ComboBox.Style> 
</ComboBox> 

yerine {StaticResource {x:Type ComboBox}} arasında.

Ancak bu özel görev için bir stil tanımlamanıza gerek yoktur. Sadece bir bağlayıcı IsEnabled için özelliğini ayarlayın ve bir mantıksal değere başka açılan kutunun seçili öğeyi dönüştürmek için bir dönüştürücü kullanabilirsiniz: Bir Stil ile bunu yapma gerekmez

<ComboBox Grid.Column="1" Grid.Row="1" 
       Name="AnalysisComboBox" 
       MinWidth="200" 
       VerticalAlignment="Center" HorizontalAlignment="Left" 
       ItemsSource="{Binding Path=AvailableAnalysis}" 
      IsEnabled="{Binding SelectedItem,ElementName=ApplicationComboBox, Converter={StaticResource NotNullConverter}"/> 
+0

Bu kadar işe yarıyor. Dönüştürücü seçeneğinin daha temiz olduğuna karar verdim, böylece doğru olarak işaretledim. – KrisTrip

0

sadece "normal olabilir aşağıdaki gibi doğrudan bir değer dönüştürücü kullanılarak "değer değişimi için bir değer dönüştürücüsüyle bağlanma" => true, "value is null" => false.

İlgili konular