2014-10-31 4 views
1

У меня есть 4 RadioButtons в UniformGrid.Как установить все свойства RadioButton IsChecked на false

Первоначально они все установлены на false.

Но как только я нажимаю на один из них, он остается правдивым во все времена.

Наше требование состоит в том, чтобы все они могли быть установлены на false.

Я пытался что-то вроде

<MultiDataTrigger> 
    <MultiDataTrigger.Conditions> 
     <Condition Binding="{Binding IsChecked, 
        RelativeSource={RelativeSource Self}}" Value="True"/> 
     <Condition Binding="{Binding IsPressed, 
        RelativeSource={RelativeSource Self}}" Value="True"/> 
    </MultiDataTrigger.Conditions> 
    <Setter Property="IsChecked" Value="False"/> 
</MultiDataTrigger> 

Но это не работает. Я знаю, что могу использовать ToggleButton, но только один из моих RadioButtons можно проверить одновременно.

Возможно ли это?

ответ

0

Ваше решение работает только при нажатии кнопки мыши (попробуйте удержать его, и вы увидите). Самый простой способ, который приходит на ум, чтобы изменить RadioButton немного, чтобы удовлетворить наши потребности:

public class UncheckableRadioButton : RadioButton 
{ 
    protected override void OnToggle() 
    { 
     if (IsChecked == true) 
     IsChecked = false; 
     else base.OnToggle(); 
    } 
} 

Theese пользовательские радиостанции будут отмените при повторном нажатии.

+0

Не так, как я решил свою проблему, но приятен для будущих читателей. – DeMama

+0

@DeMama, не могли бы вы поделиться своим решением (посредством редактирования или отдельного ответа)? Это может быть действительно полезно для других, и довольно интересно для нас, которые ответили на вопрос =) – icebat

+0

Здесь вы идете. Однако учтите, что это решение очень специфично для того, что мне нужно. – DeMama

0

Я могу сразу сказать вам, что стиль не решит вашу проблему, потому что, как только пользователь устанавливает значение DependencyProperty, он игнорирует стилизаторы, вы должны прочитать на Dependency Property Value Precedence.

С другой стороны, вы можете попробовать обработки мыши по своему усмотрению, когда кнопка радио IsChecked = True, например, так:

 <RadioButton GroupName="AAA" PreviewMouseLeftButtonDown="RadioButton_PreviewMouseLeftButtonDown"/> 

И:

private void RadioButton_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     RadioButton radioButton = sender as RadioButton; 

     if (radioButton != null && radioButton.IsChecked.GetValueOrDefault()) 
     { 
      radioButton.IsChecked = false; 
      e.Handled = true; 
     } 
    } 

Я думаю, что это делает Хитрость.

+0

Что делать, если клавиатура используется для переключения радиостанций? =) – icebat

+0

Я предполагаю, что вам также нужен пользователь PreviewKeyDown, с тем же кодом, проверяя, была ли нажатая клавиша пробелом ... – Yoav

0

По просьбе icebat, я вывешу мое решение:

Я просто создан обработчик событий для моего RadioButtons где я сравниваю определенные значения, определенные в классе:

private int PopupID; 
private bool IsPopupActive; 
private void RadioButton_Click(object sender, RoutedEventArgs e) 
{ 
    RadioButton rb = (RadioButton)sender; 
    string s = (string)rb.Content; 
    int id = int.Parse(s); 

    if (PopupID == id && IsPopupActive == true) 
    { 
     foreach (RadioButton rbb in PopupGrid.Children.OfType<RadioButton>()) 
      rbb.SetValue(RadioButton.IsCheckedProperty, false); 

     IsPopupActive = false; 
    } 
    else if (PopupID != id || IsPopupActive == false) 
    { 
     foreach (RadioButton rbb in PopupGrid.Children.OfType<RadioButton>() 
       .Where(x => x != rb)) 
      rbb.SetValue(RadioButton.IsCheckedProperty, false); 

     IsPopupActive = true; 
     PopupID = id; 
    } 
} 

Не большой поклонник такие решения, как это, но это работает.

Смежные вопросы