2017-11-15 3 views
0

Ich möchte, dass das Kombinationsfeld beim Drücken einer der Optionsfelder aktiviert wird.Wie binde ich Combobox IsChecked auf 4 Schaltflächen aus der gleichen Gruppe?

<RadioButton x:Name="A" GroupName="rButton" Content="A" Grid.Column="4"/> 
<RadioButton x:Name="B" GroupName="rButton" Content="B" Grid.Column="4"/> 
<RadioButton x:Name="C" GroupName="rButton" Content="C" Grid.Column="4"/> 
<RadioButton x:Name="D" GroupName="rButton" Content="D" Grid.Column="4"/> 

<ComboBox IsEnabled="{Binding IsChecked,?? }" Grid.Column="5" Width="120" Height="30"/> 
+0

Nur um zu klären, möchten Sie die ComboBox einmal ** alle ** der RadioButtons aktiviert ist aktiviert? –

+0

@Manfred Radlwimmer ja – sivan24

Antwort

2

Wenn Sie dies über Bindungen lösen wollen (und sollten), benötigen Sie ein MultiBindingConverter die true solange einer der Werte zurückgibt, ist true (boolean OR):

public class BooleanOrConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     foreach (object value in values) 
     { 
      if (value is bool && (bool) value) 
       return true; 
     } 
     return false; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     return Enumerable.Repeat(DependencyProperty.UnsetValue, targetTypes.Length).ToArray(); 
    } 
} 

Definition :

<Window.Resources> 
    <local:BooleanOrConverter x:Key="OrConverter"/> 
</Window.Resources> 

Verbrauch:

<RadioButton x:Name="RadioButtonSource" GroupName="rButton" Content="A" Grid.Column="4"/> 
<RadioButton x:Name="RadioButtonToken" GroupName="rButton" Content="B" Grid.Column="4"/> 
<RadioButton x:Name="RadioButtonII" GroupName="rButton" Content="C" Grid.Column="4"/> 
<RadioButton x:Name="RadioButtonUkey" GroupName="rButton" Content="D" Grid.Column="4"/> 

<ComboBox Grid.Column="5" Width="120" Height="30"> 
    <ComboBox.IsEnabled> 
     <MultiBinding Converter="{StaticResource OrConverter}"> 
      <Binding ElementName="RadioButtonSource" Path="IsChecked"/> 
      <Binding ElementName="RadioButtonToken" Path="IsChecked"/> 
      <Binding ElementName="RadioButtonII" Path="IsChecked"/> 
      <Binding ElementName="RadioButtonUkey" Path="IsChecked"/> 
     </MultiBinding> 
    </ComboBox.IsEnabled> 
</ComboBox> 

Auf diese Weise sobald jede der RadioButtons ‚s IsChecked Eigenschaften wird true wird die ComboBox aktiviert. Wenn Sie die RadioButton s zurücksetzen, wird es wieder deaktiviert.

+0

Wenn es nur eine visuelle Operation ist, warum sollte es mit Viewmodel getan werden? Meiner Meinung nach sollte das UI-Zeug im Code hintermalt sein. Es gibt keinen Grund, das ViewModel zu durchlaufen, um nicht nur eine einfache Aufgabe zu verkomplizieren, die mit einem Klick-Event erledigt werden kann. –

+0

@DanieleSartori Ich habe keine Ahnung, worüber Sie sprechen, in meinem Code ist absolut kein ViewModel. Wie für * "Meiner Meinung nach sollte das UI-Zeug im Code hinterher ausgefüllt werden" * Ich stimme dieser Aussage nicht zu. Würden Sie "VisualStates", "StoryBoards", "DataTemplates" und "Styles" auch in Code-Behind generieren? Ich hoffe nicht. –

+0

@DanieleSartori Ich stimme dir nicht zu. UI-Inhalte sollten in XAML oder ResourceDictionaries enthalten sein. – Sasha

Verwandte Themen