2012-12-26 4 views
2

Вопрос, который у меня есть, является расширением следующего ответа. В нем указано, что имя_группы переключателя имеет очень широкую область видимости, и часто бывает лучше просто назначить имя_группы автоматически контейнером.Группа Radio Button в DataTemplate ListView

https://stackoverflow.com/a/6062697/907920

Если я использую статический GroupName, то все Radiobuttons разделяют группу. (Как ответ в указанной ссылке.)

Однако, если я не использую имя GroupName, то каждый отдельный RadioButton обрабатывается, как если бы он был в отдельной группе. Я могу только предположить, что он использует DataTemplate или CellTemplate, поскольку он является «родительским», чтобы автоматически назначать GroupName.

У меня есть список вопросов в StackPanel. Каждый вопрос отображается в UserControl. Каждый вопрос содержит ListView ответов. Каждый ответ имеет логическое свойство, которое указывает, что был выбран ответ, который привязывается к RadioButton внутри DataTemplate.

Мой урезанная XAML следующим образом

<ListView ItemsSource="{Binding AnswerList}" > 
     <ListView.View> 
     <GridView> 
      <!-- Other columns here --> 
      <GridViewColumn> 
      <GridViewColumn.CellTemplate> 
       <DataTemplate> 
       <RadioButton IsChecked="{Binding Path=AnswerChecked}" /> 
       </DataTemplate> 
      </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
     </GridView> 
     </ListView.View> 
    </ListView> 

Я не думаю, что у меня есть какой-либо другой вариант, но использовать ListView, так как мне нужно, чтобы иметь возможность включить другие столбцы и на, а также как необходимость отображать два или более ответов.

Есть ли способ сообщить мне, что она является частью UserControl, а не DataTemplate для целей ее GroupName?

Я рассмотрел назначение GUID каждому UserControl и привязку GroupName RadioButtons к строке GUID, но это кажется чрезмерным и неуклюжим.

Edit: Для визуального сравнения, UI потоков о как это, мои заметки в скобках:

(StackPanel вопросов, связанных с коллекцией вопросов)

  1. Вопрос управления (Содержит ListView связан с коллекцией ответов «|» ограничивает столбцы)
    • [] | Ответ 1 (Объект непроверенного ответа с текстом «Ответ 1»)
    • [] | Ответ 2
    • [*] | Ответ 3 (Checked ответа Объекта с текстом "Ответом 3")
  2. Кто был шестнадцатым президентом
    • [] | Karl Marx
    • [*] | Abraham Lincoln
    • [] | Ричард Никсон
  3. Каков вес одного моля водорода
    • [] | 10g
    • [] | ,1g
    • [] | 1g
+0

«Я рассматривал назначение GUID для каждого UserControl и привязку GroupName RadioButtons к строке GUID, но это кажется чрезмерным и неуклюжим». - И это не сработало. Я закончил тем же вопросом, что и раньше. Каждый RadioButton рассматривался как независимый от других. –

+0

Похоже, я лаяю неправильное дерево с этим. Радио кнопки (по крайней мере в 4.5) будут автоматически сгруппированы по их контейнеру. –

ответ

1

вы должны быть в состоянии уйти с чем-то вроде этого

<RadioButton GroupName="{Binding}" IsChecked="{Binding Path=AnswerChecked}" /> 

Это должно сгруппировать их все вместе.

Если ListView является частью QuestionControl почему бы не связать QuestionText как вопросы должны быть уникальными

<RadioButton GroupName="{Binding Path=TheQuestionText}" IsChecked="{Binding Path=AnswerChecked}" /> 

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

<RadioButton GroupName="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type QuestionControl}}, Path=QuestionText"} /> 
+0

Это приводит к тому, что все элементы управления RadioButtons через элементы Question рассматриваются как часть одной группы. Мне нужно, чтобы каждый из элементов управления RadioButtons рассматривался как одна группа, отдельно от других RadioButtons в других элементах контроля. –

+0

ahh .. У меня возникли проблемы с пониманием того, как ваш макет подходит друг к другу, можете ли вы опубликовать скриншот, возможно? –

+1

Не могли бы вы использовать текст вопроса как имя группы RadioButtons, поскольку вопросы должны быть уникальными? –

0

Это заставило меня пройти мимо тупика, но я этого не допущу. Это решение далеко не оптимально.

Я переключился на использование CheckBox, и в VM я добавил этот код к обратному вызову PropertyChanged ответа, и я добавил свойство «AllowAnswer» в объект ответа.

void AnswerItemChanged(object sender, PropertyChangedEventArgs e) 
    { 
    if (e.PropertyName == "AnswerChecked") 
    { 
     bool hasAnswer = false; 
     foreach(Answer answer in Answers) 
     { 
      if (answer.AnswerChecked == true) 
      { 
       hasAnswer = true; 
       break; 
      } 
     } 

     foreach (Answer answer in Answers) 
     { 
      substep.PropertyChanged -= AnswerItemChanged; 

      if (hasAnswer && !answer.AnswerChecked) 
      { 
       answer.AllowAnswer = false; 
      } 
      else 
      { 
       answer.AllowAnswer = true; 
      } 

      substep.PropertyChanged += AnswerItemChanged; 
     } 
    } 
    } 

Это позволяет CheckBox обезопасить функциональность мьютекса RadioButton. Однако на практике это намного больше, так как пользователю теперь нужно отменить выбор, чтобы выбрать другой.