2009-09-13 6 views
1

У меня есть RadioButton группа:DataBind радиокнопки группы собственности

<TextBlock Height="24" Text="Update Interval (min):"/> 
<RadioButton x:Name="radioButtonTimerNone" IsChecked="{Binding UpdateInterval, Converter={StaticResource updateIntervalToCheckedConverter}, Mode=TwoWay}"} Content="None" /> 
<RadioButton x:Name="radioButtonTimerOne" IsChecked="{Binding UpdateInterval, Converter={StaticResource updateIntervalToCheckedConverter}, Mode=TwoWay}" 
       Content="1" /> 
<RadioButton x:Name="radioButtonTimerFive" IsChecked="{Binding UpdateInterval, Converter={StaticResource updateIntervalToCheckedConverter}, Mode=TwoWay}" 
       Content="5" /> 

и свойство:

public int UpdateInterval { 
     get { return _updateInterval; } 
     set { _updateInterval = value; 
      onPropertyChanged("UpdateInterval"); 
     } 
    } 

Как привязать к радиокнопке к свойству, поэтому radioButtonTimerNone проверяется при UpdateInterval 0 , radioButtonTimerOne проверяется, когда UpdateInterval равен 1 и т. д.
Я попытался создать преобразователь, но он не определяет, какой rb устанавливается:

[ValueConversion(typeof(RadioButton), typeof(bool))] 
class UpdateIntervalToCheckedConverter : System.Windows.Data.IValueConverter 
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 

Я ожидал, что «значение» будет радиобъектом, но оно, по-видимому, является значением UpdateInterval.

Спасибо за любые подсказки ...

ответ

1

Вашего конвертер значения не получает сказал, который RadioButton изменил значение - все связывание знает, что «IsChecked» имущество было изменено, так что новое значение IsChecked является единственное, что он может сказать конвертеру.

Первое, что приходит на ум, чтобы поставить параметр преобразователя с каждым из ваших привязок:

<RadioButton 
    x:Name="radioButtonTimerNone" 
    IsChecked="{Binding UpdateInterval, Converter={StaticResource updateIntervalToCheckedConverter}, ConverterParameter=0, Mode=TwoWay}" 
    Content="None" /> 
<RadioButton 
    x:Name="radioButtonTimerOne" 
    IsChecked="{Binding UpdateInterval, Converter={StaticResource updateIntervalToCheckedConverter}, ConverterParameter=1, Mode=TwoWay}" 
    Content="1" /> 
<RadioButton 
    x:Name="radioButtonTimerFive" 
    IsChecked="{Binding UpdateInterval, Converter={StaticResource updateIntervalToCheckedConverter}, ConverterParameter=5, Mode=TwoWay}" 
    Content="5" /> 

Так что теперь параметр «параметр» по методу «Преобразование» будет иметь значение «0 "," 1 "или" 5 "в зависимости от того, какой флажок был установлен RadioButton. I думаю,, хотя я не уверен, что параметр будет иметь строку типа, поэтому вам, возможно, придется учитывать это при опросе значения.

+0

Спасибо, я получил работу, используя ваше предложение. Не кажется очень чистым, хотя, чтобы передать то, что по существу является идентификатором для элемента управления, которого я хочу связать с этим свойством .... – Number8

+0

Да, я не знаю, есть ли «более чистое» решение. Я не большой поклонник конвертеров ценности в целом, но если вам нужно использовать один, то ConverterParameter может сделать вашу жизнь намного проще! –

+0

Это решение, которое я бы выбрал. Хотя это не очень чисто, мне в целом нравится это лучше, чем решение Андерсона о том, что на ViewModel есть куча свойств. Но, я думаю, это потому, что мне не очень нравится, когда мой ViewModel поддерживает просмотр, поэтому я могу поддерживать структурированное скинирование. – dustyburwell

2

Если вы используете MVVM и привязаны к ViewModel (я бы предположил, что вы есть), я обычно считаю, что мой ViewModel является большим ValueConverter. Почему бы не поместить эту логику в свойства для каждого?

Вот пример одного из них:

public bool Timer5Enabled 
{ 
    get { return UpdateInterval == 5; } 
} 

И тогда вы бы просто привязать к этому:

<RadioButton 
    x:Name="radioButtonTimerOne" 
    IsChecked="{Binding Timer5Enabled, Mode=OneWay}" 
    Content="1" /> 

Единственное, что вы должны были бы изменить бы, чтобы связать ваш интервал обновления логики для повышения OnChanged для зависимых свойств:

public int UpdateInterval { 
     get { return _updateInterval; } 
     set { _updateInterval = value; 
      onPropertyChanged("UpdateInterval"); 
      onPropertyChanged("Timer5Enabled"); 
      onPropertyChanged("..."); 
     } 
    } 

ValueConverters хороши, чтобы избежать, если вам Можно.

0

Возможно, вы можете рассмотреть наличие List<...> с различными интервалами. Тип списка предпочтительно должен быть нестандартным (например, UpdateInterval) или KeyValuePair<K,V>, чтобы отделить то, что показано пользователю от фактического значения.

Тогда у вас может быть ListBox, связанный с этим списком, и каждый ListBoxItem с шаблонами для отображения RadioButton. Затем в шаблоне вы привязываете радиокнопку IsChecked к ListBoxItem.IsSelected.

Последний штрих, чтобы связать ваше имущество с ListBoxSelectedItem или SelectedValue.

0

Это была очень неприятная проблема для меня.

Класс WPF RadioButton имеет ошибку, которая удаляет привязку для свойства IsChecked, когда вы назначаете несколько RadioButtons тому же GroupName. Люди много работали, но когда мне пришлось снова это посетить, я придумал то, что меня не тошнит.

Так что вы должны сделать, это подкласс класса RadioButton с этим:

public class RadioButton: System.Windows.Controls.RadioButton 
{ 
    protected override void OnClick() 
    { 
     base.OnClick(); 

     SetValue(CurrentValueProperty,CheckedValue); 
    } 

    public int CurrentValue 
    { 
     get { return (int)GetValue(CurrentValueProperty); } 
     set { SetValue(CurrentValueProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for CurrentValue. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty CurrentValueProperty = 
     DependencyProperty.Register("CurrentValue", typeof(int), typeof(RadioButton), new FrameworkPropertyMetadata(0,FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, CurrentValue_Changed)); 

    public static void CurrentValue_Changed(object sender, DependencyPropertyChangedEventArgs e) 
    { 
     ((RadioButton)sender).IsChecked = ((RadioButton)sender).CurrentValue == ((RadioButton)sender).CheckedValue; 
    } 

    public int CheckedValue 
    { 
     get { return (int)GetValue(CheckedValueProperty); } 
     set { SetValue(CheckedValueProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for CheckedValue. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty CheckedValueProperty = 
     DependencyProperty.Register("CheckedValue", typeof(int), typeof(RadioButton), new UIPropertyMetadata(0)); 
} 

Все это делает добавить два свойства зависимостей, так что вы можете сделать сравнение равенства.

Таким образом, в XAML пример будет таким:

<UserControl x:Class="MyClass" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:c="clr-namespace:MVVMLibrary;assembly=MVVMLibrary" 
    Height="Auto" Width="Auto"> 

      <c:RadioButton CurrentValue="{Binding MyValue}" CheckedValue="1" GroupName="SearchType" >Value 1</c:RadioButton> 
      <c:RadioButton Grid.Column="1" CurrentValue="{Binding MyValue}" CheckedValue="2" GroupName="SearchType" >Value 2</c:RadioButton> 
    </UserControl> 

Так что если вы заметили, все, что вы делаете это 1) Привязать к CurrentValue собственности 2) Установить свойство CheckedValue к значению, которое сделало бы RadioButton checked 3) Установите RadioButtons на то же GroupName

Если вы заметили, что я сделал CurrentValue и CheckedValue int type. Причина, по которой я это сделал, - это привязать CurrentValue к перечислению. Я думаю, что это потрясающе, но это только мое мнение, которое, вероятно, не учитывается. :)

Надеюсь, это поможет кому-то.

0

Одним из возможных вариантов является внедрение IValueConverter и настроить его прохождения ожидаемого значения перечисления для каждого RadioButton вам нужно связать, как я описал here в моем блоге.

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