2012-12-26 77 views
2

我的問題是以下答案的擴展。它聲明一個單選按鈕的GroupName的範圍非常廣泛,通常最好讓GroupName由容器自動分配。ListView的DataTemplate中的單選按鈕組

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

如果我使用一個靜態的組名,那麼所有的單選按鈕的共享羣組。 (正如答案中所示的鏈接。)

但是,如果我不使用GroupName,那麼每個單獨的RadioButton被視爲它自己在一個組中。爲了自動分配GroupName,我只能假定它使用DataTemplate或CellTemplate作爲「父」。

我有一個StackPanel中的問題列表。每個問題都顯示在UserControl中。每個問題都包含答案的ListView。每個答案都有一個布爾屬性,用於指示已選擇答案,該答案綁定到DataTemplate中的RadioButton。

我剝了下來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?

我曾考慮給每個UserControl分配一個GUID並將RadioButton的GroupName綁定到GUID的字符串,但這看起來過分笨拙。

編輯:對於Visual參考,UI流動這樣的,我在括號註釋:

  1. 問題控制(綁定到問題的集合問題的StackPanel中)(包含一ListView綁定到Answers'|'分隔列的集合​​)
    • [] |答案1(未選中的回答對象,文本爲「答案1」)
    • [] |回答2
    • [*] |答案3(經過應答對象隨文字 「答3」)
  2. 誰是第16任總統
    • [] |卡爾·馬克思
    • [*] |亞伯拉罕林肯
    • [] |尼克松
  3. 什麼是一個氫摩爾的重量
    • [] | 10g
    • [] | 。1g
    • [] | 1克
+0

「我考慮爲每個UserControl分配一個GUID並將RadioButtons的GroupName綁定到GUID的字符串,但這看起來過於笨拙。」 - 也沒有工作。我結束了與以前相同的問題。每個RadioButton都被視爲獨立於其他人。 –

+0

好像我在用這個吠叫錯誤的樹。單選按鈕(至少4.5)將自動按其容器分組。 –

回答

1

你應該能夠有所收穫遠這樣

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

這應該組它們放在一起。

如果ListView的是,爲什麼不綁定QuestionText的問題應該是唯一的

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

您可能需要使用FindAncestorQuestioncontrolDataTemplate

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

這會導致問題控件中的所有RadioButton被視爲一個組的一部分。我需要的是對於RadioButton,每個Question控件都被視爲一個組,與其他Question控件中的其他RadioButton分開。 –

+0

啊..我無法理解你的佈局如何組合在一起,你可以張貼截圖嗎? –

+1

難道你不只是使用問題文本作爲RadioButtons組名稱,因爲問題應該是唯一的? –

0

訪問QuestionControl的一部分這讓我越過了僵局,但我不會接受它。這個解決方案遠非最佳。

我切換到使用複選框,並在虛擬機中,我將此代碼添加到Answer的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的互斥功能。但是,實際上它更笨拙,因爲用戶現在不得不取消選擇另一個答案的答案。

相關問題