私を正しい方向に向けてくれた Josh と Rachel に感謝します。
レイチェルが提案したものと同様の解決策を思いつきました。私の問題は、ItemTemplateSelector を機能させることができず、リストボックスから状態 IsSelected を渡す方法がわからなかったことです。また、ListBox アイテムは単一の要素よりもはるかに複雑であるため、DataTemplate を使用することもできませんでした (以前の投稿では、例のために単純化しました)。
とにかく、私は次の解決策を思いつきました。あまりエレガントではありませんが、機能します:
Application リソースで新しいスタイルを定義しました。
<Style x:Key="TextBlockTemplate" TargetType="ComboBox">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<TextBlock Text="{Binding}" Margin="3" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
ListBox に SelectionChanged および PreviewMouseDown ハンドラーを追加しました。
MyListBox_PreviewMouseDown を定義しました。
private void MyListBox_PreviewMouseDown(オブジェクト送信者, MouseButtonEventArgs e)
{
// 選択されたリスト ボックス項目を取得します。
オブジェクト要素 = (e.OriginalSource as FrameworkElement).DataContext;
var item = MyListBox.ItemContainerGenerator.ContainerFromItem(要素)
ListBoxItemとして;
// ListBox の行を選択済みとしてマークします。
if (項目 != null)
item.IsSelected = true;
}
- MyListBox_SelectionChanged を定義しました。
プライベート コンボ ボックス prevComboBox = null;
private void MyListBox_SelectionChanged(オブジェクト送信者、SelectionChangedEventArgs e)
{
// リスト ボックスを取得します。
ListBox リスト = ListBox としての送信者;
// 選択できる項目は 1 つだけですが、
// 選択されたすべてのアイテムを繰り返し処理します。
foreach (list.SelectedItems の MyDataItem データ)
{
var item = list.ItemContainerGenerator.ContainerFromItem(dat) as ListBoxItem;
// FindElement は、ビジュアル ツリー内の要素を検索するためのヘルパー メソッドです。
ComboBox cbo = FindElement(item, "MyComboBox") as ComboBox;
if (cbo != prevComboBox)
{
cbo.Style = null;
if (prevComboBox != null)
prevComboBox.Style =
(Style)Application.Current.Resources["TextBlockTemplate"];
prevComboBox = cbo;
}
}
}
ありがとう、レシェク