10

から継承する を使用するプロジェクトをRadioButtonList継承しましたListBox。これは Web から削除され (現在はリンクが見つかりません)、RadioButtonList.cs (6 つの依存関係プロパティを含む) と RadioButtonList.xaml (スタイルとコントロール テンプレートのみ) が含まれています。

このコントロールは、100 以上の場所で使用されています。完全で専門的なコントロールではないため、問題が発生します。フォーカスの問題、キーボード ナビゲーションなどの問題。(コメントを参照してください。)

過去数年間にさまざまな時期に多くの調査を行った結果、この制御は実際には必要ないように思われます。GroupNameラジオボタンのグループにプロパティを設定するだけです。また、コントロールが使用される唯一の理由RadioButtonListは、継承されListBoxた .

1) この管理は本当に必要か? より良い方法はありますか?

2) 頭痛の種なしにデータバインディングの利点を得ることができる、オープンソースまたはその他の専門的なコントロールはありますか? (私たちは Infragistics と DevExpress を使用していますが、これらのスイートが提供するすべてのコントロールに精通しているわけではありません。)

私の答え

1a) この管理は本当に必要ですか?

  • ラジオ ボタンのリストが 1 つだけ必要な場合は、このコントロールは必要ありません。
  • アプリケーションが多数のラジオ ボタンのリストを使用する場合、はい、このコントロールが必要です。
  • さまざまなアプリケーションでラジオ ボタンのリストを使用する場合は、おそらくこのコントロールが必要です。

1b) もっと良い方法はありますか?

  • ListBox、 、またはその他から派生させて、ItemsControlスタイルとテンプレートを作成することが、このコントロールを作成する唯一の方法です。したがって、良い方法はありません。

2)プロのコントロールはありますか...

  • 間違いなく、ListBoxEditRadioListBoxEditStyleSettings.

回答に関するコメント

すべての回答は、RadioButtonListコントロールを作成する必要がないことを示しています。それでも、ラジオ ボタンのリストが 2 つ以上必要な場合は、スタイルとコントロールのテンプレート、および場合によってはデータ テンプレートを作成するまでに、radio-button-list- と呼ばれるコード アーティファクトのコレクションができあがります。コントロール。したがって、私の意見では、 aRadioButtonListが必要です。

さらに、私の理解ではRadioButtonList、初期の WPF CTP で削除されました。簡単に作成できるようなコントロールの必要性が限られているため、これは理解できます。

受け入れられた回答に関するコメント

2)プロのコントロールはありますか...

  • 間違いなく、ListBoxEditRadioListBoxEditStyleSettings.

最後に、Mike Strobel's Answer にコメントしてください

私が持っているのRadioButtonListは、彼の答えの最終結果です。私はカスタム コントロールの作成が得意ですが、Infragistics や DevExpress などのサードパーティ コンポーネント メーカーに、このような基本的なコントロールの作成とサポートを任せています。

4

4 に答える 4

4

このコントロールは本当に必要ですか?より良い方法はありますか?

@lawc が指摘しているように、いいえ、必要ありません。ただし、希望する柔軟性のレベルによっては、この方法が望ましい場合もあります。再利用可能なスタイルを作成するのは簡単ですが、それを「正しく」行うには、単に custom を設定するよりも少し複雑ですItemTemplate

スタイルの使用

WPFのItemsControlは、その項目を適切なコンテナーにラップします。コア WPF の各セレクター コントロールは、アイテムが独自のコンテナーとして機能できるかどうかを判断するロジックと、新しいアイテム コンテナーを生成するファクトリ コードをオーバーライドします。ListBoxたとえば、Aは、その各アイテムを でラップしますListBoxItem(アイテム自体が既に である場合を除くListBoxItem)。これらのコンテナーに適用されるスタイルは、プロパティItemsControlを介して親に設定できItemContainerStyleます。これは、コンテナーItemTemplateのアイテムの外観を制御できるプロパティとは異なります。具体的には、コンテナ内に適用されたコンテンツ テンプレートをオーバーライドします。ContentPresenter

aRadioButtonは から派生していないためListBoxItem、 を設定するだけで、コントロール内に埋め込まれたコントロールItemTemplateのリストが生成されます。つまり、コントロールに通常関連付けられているものと同じ選択クロムが引き続き存在し、レイアウトやフォーカスが奇妙になる可能性があります。これはおそらくあなたが望むものではありません。RadioButtonListBoxItemListBox

代わりに、 をオーバーライドして、それを使用して、を埋め込むItemContainerStyleカスタム テンプレートを割り当てます。おそらく、プロパティをまったく設定しなくても済むので、名前の衝突の可能性がなくなります。代わりに、プロパティとテンプレート化された親のプロパティの間に双方向バインディングを確立するだけです。ListBoxItemRadioButtonGroupNameRadioButton.IsCheckedListBoxItem.IsSelected

この手法を便利に使用するために、通常、適切なインスタンスにStyle適用できるリソース (アプリケーション全体で使用可能) を作成し、 . または、コンテナー スタイルをグローバル リソースとして使用可能にし、それをインスタンスに設定することもできます。いずれにせよ、プロパティを設定する必要があります。ListBoxItemContainerStyleListBox

カスタム コントロールの使用

WPF のエバンジェリストは、カスタム コントロールよりもカスタム スタイルを優先するという哲学をよく口にしますが、実際には、これが常に便利であるとは限りません。RadioButtonListコントロールを拡張するを作成してからListBox、上記のカスタム スタイルを自動的に適用するデフォルト スタイルをコントロールに与える方が便利な場合があります。ListBoxこれにより、すべてのインスタンスでリスト スタイルまたはコンテナー スタイルを手動で割り当てる必要がなくなりますが、大きな利点ではありません。

しかし、項目の外観をもう少し制御したい場合がありRadioButtonます。たとえば、次のことが必要な場合があります。

  1. RadioButton各アイテムの「箇条書き」の周りの余白を調整します。
  2. コンテンツに対する箇条書きの垂直方向の配置を調整します。
  3. 水平方向と垂直方向の両方をサポートします。
  4. RadioButton選択されていないアイテムのコンテンツを自動的に無効にします。

から派生した可能性が高い独自の実装を作成するとListBox、アプリケーション全体でラジオ リストを既に使用している場合でも、これらの機能を簡単に追加できます。これは上記の手法でも実行できますが、添付されたビヘイビアまたはいくつかの添付プロパティが必要になる場合があり、その場合、多少断片的なデザインになってしまいます。

サードパーティのソリューション

頭痛の種なしにデータバインディングの利点を得ることができる、オープンソースまたはその他の専門的なコントロールはありますか?

これは珍しい使用例ではなく、いくつかの実装が浮かんでいることは間違いありません。オープン ソース フレームワークにあるものもあれば、オープン ソース アプリケーションから抽出されたものもあります。サードパーティの実装については、ActiproRadioButtonListがすべての WPF コンポーネントに含まれている共有 WPF ライブラリに を同梱していることを知っています。最後に確認したとき、それ自体は利用できませんでした。ただし、上記の追加機能はすべてサポートしています。

于 2013-10-04T17:48:32.233 に答える
1

私の意見では、このコントロールは必要ありません。.Net ListBox を使用するだけで、既存のすべての機能を実現できます。

  1. ListBox.ItemsSource を使用すると、オプション コレクションをデータ バインドできます
  2. RadioButton を含む ListBox.ItemTemplate を指定します。このテンプレートでは、ビュー モデル プロパティを RadioButton.GroupName にデータ バインドできます。
于 2013-10-01T01:12:23.203 に答える
1

ListBoxEditDevExpress は aと aを使用してRadioListBoxEditStyleSettingsRadioButton のグループを表しているとしか言いようがありません。実際には、使用しているコントロールと同じですが、より優れた機能を提供し、十分にテストされていると思います。RadioButton は DevExpress によって提供されません。私のアプリケーションでは、WPF/Silverlight によって提供されるデフォルトの RadioonButton-Control を使用します。

DevExpress の RadioListBoxEdit を次のように使用します。

<dxe:ListBoxEdit SelectedItem={Binding CheckItem, Mode=TwoWay}>
  <dxe:ListBoxEdit.StyleSettings>
    <dxe:RadioListBoxEditStyleSettings />
  </dxe:ListBoxEdit.StyleSettings>
</dxe:ListBoxEdit>

DevExpress の ListBoxEdit の詳細については、こちらを参照してください。

于 2013-10-07T18:23:31.047 に答える