Привязка радиокнопки wpf

У меня есть приложение wpf master-detail. «Мастер» — это datagrid, а «подробности» — два переключателя. В зависимости от выбора строки переключатели проверяются в разделе «Подробности».

Я привязываю свою радиокнопку следующим образом, используя inttoboolean конвертер. ксэмл:

<StackPanel Margin="2">
  <RadioButton Margin="0,0,0,5" Content="In Detail" IsChecked="{Binding Path=itemselect.OutputType, Converter ={StaticResource radtointOTSB}, ConverterParameter= 0}"/>
  <RadioButton Content="In Breif" IsChecked="{Binding Path=itemselect.OutputType, Converter ={StaticResource radtointOTSB}, ConverterParameter= 1}"/>
</StackPanel>

В модели представления:

public class radtointOTSB : IValueConverter
{
    object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        int OTint = Convert.ToInt32(value);
        if (OTint == int.Parse(parameter.ToString()))
            return true;
        else
            return false;
    }

    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return parameter;
    }
}

Моя реализация хорошо работает для первых нескольких выборок в сетке данных. И вдруг ни один из моих переключателей не выбран.

Я понятия не имею, почему это происходит, любые предложения приветствуются.

Заранее спасибо.


person maran87    schedule 04.05.2012    source источник


Ответы (1)


Ищите проблемы с привязкой нескольких RadioButtons — жалоб хватает. В основном привязка не получит значение False, потому что она не передается свойству зависимости..и т.д. и т.д.

Попробуйте использовать следующий класс вместо обычного RadioButton, привяжите к IsCheckedExt, так как он принудительно обновляет значение IsChecked флажка.

public class RadioButtonExtended : RadioButton
{
    public static readonly DependencyProperty IsCheckedExtProperty =
        DependencyProperty.Register("IsCheckedExt", typeof(bool?), typeof(RadioButtonExtended),
                                    new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.Journal | FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, IsCheckedRealChanged));

    private static bool _isChanging;

    public RadioButtonExtended ()
    {
        Checked += RadioButtonExtendedChecked;
        Unchecked += RadioButtonExtendedUnchecked;
    }

    public bool? IsCheckedExt
    {
        get { return (bool?)GetValue(IsCheckedExtProperty); }
        set { SetValue(IsCheckedExtProperty, value); }
    }

    public static void IsCheckedRealChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        _isChanging = true;
        ((RadioButtonExtended)d).IsChecked = (bool)e.NewValue;
        _isChanging = false;
    }

    private void RadioButtonExtendedChecked(object sender, RoutedEventArgs e)
    {
        if (!_isChanging)
            IsCheckedExt = true;
    }

    private void RadioButtonExtendedUnchecked(object sender, RoutedEventArgs e)
    {
        if (!_isChanging)
            IsCheckedExt = false;
    }
}
person denis morozov    schedule 04.05.2012
comment
Я пробовал все другие решения для поиска, и это было единственным, которое сработало для меня. Бесконечно благодарен. - person Kelly Cox; 28.08.2014