感谢 Josh 和 Rachel 为我指明了正确的方向。
我想出了一个类似于 Rachel 建议的解决方案。我的问题是我无法使 ItemTemplateSelector 工作,而且我不知道如何从我的列表框中传递状态 IsSelected。我也不能使用 DataTemplate,因为我的 ListBox 项比单个元素复杂得多(为了示例,我在上一篇文章中对其进行了简化)。
无论如何,我想出了以下解决方案。它不是很优雅,但它有效:
我在应用程序资源中定义了一种新样式:
<Style x:Key="TextBlockTemplate" TargetType="ComboBox">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<TextBlock Text="{Binding}" Margin="3" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我将 SelectionChanged 和 PreviewMouseDown 处理程序附加到我的列表框:
我定义了 MyListBox_PreviewMouseDown:
私人无效 MyListBox_PreviewMouseDown(对象发送者,MouseButtonEventArgs e)
{
// 抓取选中的列表框项。
对象元素 = (e.OriginalSource as FrameworkElement).DataContext;
var item = MyListBox.ItemContainerGenerator.ContainerFromItem(element)
作为列表框项;
// 将 ListBox 中的行标记为选中。
如果(项目!= null)
item.IsSelected = true;
}
- 我定义了 MyListBox_SelectionChanged:
私人组合框 prevComboBox = null;
私人无效 MyListBox_SelectionChanged(对象发送者,SelectionChangedEventArgs e)
{
// 抓取列表框。
ListBox list = 作为 ListBox 的发件人;
// 虽然只能选择一项,
// 我们遍历所有选定的项目。
foreach(列表中的 MyDataItem 数据。SelectedItems)
{
var item = list.ItemContainerGenerator.ContainerFromItem(dat) as ListBoxItem;
// FindElement 是在可视化树中查找元素的辅助方法。
组合框 cbo = FindElement(item, "MyComboBox") as ComboBox;
if (cbo != prevComboBox)
{
cbo.Style = null;
if (prevComboBox != null)
prevComboBox.Style =
(样式)Application.Current.Resources["TextBlockTemplate"];
上一页组合框 = cbo;
}
}
}
谢谢, 莱斯泽克