Получить выбранный переключатель в группе (WPF) - PullRequest
9 голосов
/ 12 декабря 2010

В моей программе есть ItemsControl, который содержит список переключателей.

<ItemsControl ItemsSource="{Binding Insertions}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <RadioButton GroupName="Insertions"/>
                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

Как найти выбранную радиокнопку в группе Insertions способом MVVM?

Большинство примеров, которые я нашел в Интернете, включают установку отдельных логических свойств, с которыми вы связываете свойство IsChecked с помощью конвертера.

Есть ли эквивалент ListBox SelectedItem, который я могу связать?

1 Ответ

9 голосов
/ 12 декабря 2010

Одно из решений, которое приходит на ум, - это добавить логическое свойство IsChecked к вашим сущностям вставки и связать его со свойством IsChecked переключателя. Таким образом, вы можете установить переключатель «Проверено» в View Model.

Вот быстрый и грязный пример.

Примечание: Я проигнорировал тот факт, что IsChecked также может быть null, вы можете справиться с этим, используя bool?, если требуется.

Простая ViewModel

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;

namespace WpfRadioButtonListControlTest
{
  class MainViewModel
  {
    public ObservableCollection<Insertion> Insertions { get; set; }

    public MainViewModel()
    {
      Insertions = new ObservableCollection<Insertion>();
      Insertions.Add(new Insertion() { Text = "Item 1" });
      Insertions.Add(new Insertion() { Text = "Item 2", IsChecked=true });
      Insertions.Add(new Insertion() { Text = "Item 3" });
      Insertions.Add(new Insertion() { Text = "Item 4" });
    }
  }

  class Insertion
  {
    public string Text { get; set; }
    public bool IsChecked { get; set; }
  }
}

XAML - код позади не отображается, поскольку он не имеет кода, отличного от сгенерированного кода.

<Window x:Class="WpfRadioButtonListControlTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfRadioButtonListControlTest"
        Title="MainWindow" Height="350" Width="525">
  <Window.Resources>
    <local:MainViewModel x:Key="ViewModel" />
  </Window.Resources>
  <Grid DataContext="{StaticResource ViewModel}">
    <ItemsControl ItemsSource="{Binding Insertions}">
      <ItemsControl.ItemTemplate>
        <DataTemplate>
          <Grid>
            <RadioButton GroupName="Insertions" 
                         Content="{Binding Text}" 
                         IsChecked="{Binding IsChecked, Mode=TwoWay}"/>
          </Grid>
        </DataTemplate>
      </ItemsControl.ItemTemplate>
    </ItemsControl>
  </Grid>
</Window>
...