2016-06-13 2 views
4

От this и this (и другие) вопросы по SO и многим другим материалам в Интернете, я понял, как связать переключатель с VM.WPF + MVVM + RadioButton: ручное связывание с одним свойством

Но все они создают отдельное свойство для каждого возможного значения переключателя. Один вопрос (this) аналогичен моему требованию, но принятый ответ предполагает использовать ListBox вместо переключателя.

Для представления лица пола (Datatype CHAR, Возможные значения «M», «F»), необходимо создать три свойства в виртуальной машине в качестве PersonGender, IsPersonMale, IsPersonFemale. Я хочу управлять этим только одним свойством PersonGender. Могу ли я это сделать? Если да, то как?

+2

Поместите команду на каждый RadioButton (то же самое) и передайте их значение как параметр – nkoniishvt

+0

@nkoniishvt: Выглядит интересно; попробуем это. Но все еще не вполне приемлемо. Кнопка «Радио» представляет пользовательский ввод и отображение, например, текстовое поле или поле со списком; не действие, как Command Button. Использование команды для обработки ввода/отображения дозы не выглядит правильным. –

+0

Команда создана для MVVM, привязка к команде из пользовательского интерфейса - это то, что вы должны делать, если хотите иметь совместимое с MVVM приложение. Взгляните на учебник, подобный этому: http://www.codeproject.com/Articles/238657/How-to-use-Commands-in-WPF – nkoniishvt

ответ

4

Вам нужен конвертер.

 //define this in the Window's Resources section or something similiarly situitable 
     <local:GenderConverter x:Key="genderConverterKey" /> 


     <RadioButton Content="M" IsChecked="{Binding Gender, Converter={StaticResource ResourceKey=genderConverterKey}, ConverterParameter=M}" /> 
     <RadioButton Content="F" IsChecked="{Binding Gender, Converter={StaticResource ResourceKey=genderConverterKey}, ConverterParameter=F}" /> 

Преобразователь

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

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return (bool)value ? parameter : null;   
    } 
} 
+2

Заменить ** null ** (в ConvertBack) с помощью функции ** Binding .DoNothing ** если привязка не должна применяться в этом случае. ** return (bool) значение? параметр: Binding.DoNothing; ** –

+0

В конвертере нет ничего, что фактически связывает его с типом данных Gender. Таким образом, вы можете переименовать его, чтобы сделать его конвертером общего назначения. –

1

Ваше требование возможно, но для этого вам потребуются дополнительные усилия. Основной причиной этого является RadioButton: IsChecked is Boolean и несколько переключателей являются отдельными элементами управления и не действуют как один. Например, ListBox.

Для вашего требования к работе вы можете использовать преобразователь . Привязать IsChecked от Radiobuttons до PersonGender Свойство в ViewModel и использовать общий преобразователь и передать параметр «MALE» для мужской переключателя и «FEMALE» для женского переключателя.

В проверке преобразователя, если параметр и PersonGender однотипны и возвращают ИСТИНА для этого.

Т.е. Если параметр команды checkbox равен MALE и PersonGender также является MALE, тогда флажок включен. Else, если параметр команды checkbox FEMALE и PersonGender is MALE, флажок не активирован, так как возвращается false.

1

Использование команд (Использование DelegateCommands здесь)

VM:

public enum Genders { 
    Female, 
    Male 
} 
public YourVMClass { 
    public Genders SelectedGender {get; set;} 

    private DelegateCommand _cmdSelectGender; 

    public DelegateCommand CmdSelectGender { 
     get { return _cmdSelectGender ?? (_cmdSelectGender = new DelegateCommand(SelectGender)); } 
    } 

    private void SelectGender(Object parameter) { 
     SelectedGender = (Genders)parameter; 
    } 
} 

XAML:

<Window.Resources> 
    <ObjectDataProvider x:Key="listOfGenders" MethodName="GetValues" 
         ObjectType="{x:Type System:Enum}"> 
     <ObjectDataProvider.MethodParameters> 
      <x:Type TypeName="loca:Genders"/> 
     </ObjectDataProvider.MethodParameters> 
    </ObjectDataProvider> 
</Window.Resources> 

<ItemsControl ItemsSource="{Binding Source={StaticResources listOfGenders}}"> 
    <ItemsControl.ItemTemplate> 
     <RadioButton GroupName="Genders" Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type MainWindow}}, Path=DataContext.CmdSelectGender}" CommandParameter="{Binding}"/> 
    </ItemsControl.ItemTemplate> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
</ItemsControl> 

(не проверял код, но это идея)

0

Что вам нужно сделать, это с помощью IValueConverter, которые преобразуют Bool на Чар и наоборот. Пример True => 'M'; False => 'F'

В вашем представлении есть две кнопки Радио. Обязательно установите их в одном и том же имени группы. Затем вам нужно привязать свой PersonGender только к переключателю IsMale. , потому что установлен переключатель IsFemale. радиоуправление IsMale будет автоматически снято из-за того же имени группы.

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