2

私が持っている質問は、次の答えの拡張です。ラジオボタンのGroupNameのスコープは非常に広く、多くの場合、GroupNameをコンテナによって自動的に割り当てるのが最善であると記載されています。

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

静的なGroupNameを使用すると、すべてのRadioButtonがグループを共有します。(リンクの答えとして示されています。)

ただし、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>

他の列のオンとオフを切り替えたり、2つ以上の回答を表示したりする必要があるため、ListViewを使用する以外に選択肢はないと思います。

GroupNameの目的でDataTemplateではなくUserControlの一部であることをラジオボタンに伝える方法はありますか?

各UserControlにGUIDを割り当て、RadioButtonsのGroupNameをGUIDの文字列にバインドすることを検討しましたが、それは過度で不器用なようです。

編集:視覚的な参照のために、UIは次のように流れます。括弧内のメモは次のとおりです。

(質問のコレクションにバインドされた質問のStackPanel)

  1. 質問コントロール(回答のコレクションにバインドされたListViewが含まれています'|'は列を区切ります)
    • [] | 回答1(「回答1」というテキストが含まれるチェックされていない回答オブジェクト)
    • [] | 回答2
    • [*] | 回答3(「回答3」というテキストを含むチェック済み回答オブジェクト)
  2. 第16代大統領は誰でしたか
    • [] | カール・マルクス
    • [*] | アブラハムリンカーン
    • [] | リチャードニクソン
  3. 水素1モルの重さは?
    • [] | 10g
    • [] | .1g
    • [] | 1g
4

2 に答える 2

2

あなたはこのようなもので逃げることができるはずです

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

これにより、それらがすべてグループ化されます。

ListView が QuestionControl の一部である場合、質問は一意である必要があるため、QuestionText をバインドしないのはなぜですか

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

からFindAncestorアクセスするために使用する必要がある場合があります。QuestioncontrolDataTemplate

 <RadioButton GroupName="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type QuestionControl}}, Path=QuestionText"}  />
于 2012-12-27T07:34:37.253 に答える
0

これで行き詰まりを乗り越えましたが、受け入れられません。このソリューションは最適とはほど遠いものです。

CheckBox の使用に切り替え、VM でこのコードを Answer の PropertyChanged コールバックに追加し、Property "AllowAnswer" を Answer オブジェクトに追加しました。

    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 のミューテックス機能を模倣できます。ただし、ユーザーが別の回答を選択するには、回答の選択を解除する必要があるため、実際にははるかに厄介です。

于 2012-12-27T20:49:53.093 に答える