我想这样做,所以需要双击才能选择 ListBox 中的项目。此选定项目应始终为粗体。我知道SelectedItem属性将不再反映我将其视为所选项目的项目,因此我之前用来使所选项目加粗的 XAML 将不再起作用。
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="FontWeight" Value="Bold"/>
</Trigger>
</Style.Triggers>
</Style>
</ListBox.ItemContainerStyle>
我研究了如何使用 MVVM 处理双击并得出结论,可以使用后面的代码和 MouseDoubleClick 事件。
private void lbProfiles_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
_viewModel.SelectedProfile = ((ListBox)sender.)SelectedItem as MyProfile;
//What should go here?
}
我的视图模型将有一个SelectedProfile属性,我认为该属性将在上述方法中设置。无论如何在 XAML 中绑定SelectedProfile还是必须在后面的代码中进行管理?另外,让这个项目加粗的最好方法是什么?
编辑1:
我最终稍微调整了 Rachel 的答案,以便单击该项目突出显示但未选中。这样视图模型可以有一个 SelectedItem 属性和一个 HighlightedItem 属性。
private void ListBoxItem_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
if (e.ClickCount < 2)
e.Handled = true;
var clickedItem = ((ContentPresenter)e.Source).Content as MyProfile;
if (clickedItem != null)
{
//Let view model know a new item was clicked but not selected.
_modelView.HighlightedProfile = clickedItem;
foreach (var item in lbProfiles.Items)
{
ListBoxItem lbi =
lbProfiles.ItemContainerGenerator.ContainerFromItem(item) as ListBoxItem;
//If item is not displayed on screen it may not have been created yet.
if (lbi != null)
{
if (item == clickedItem)
{
lbi.Background = SystemColors.ControlLightBrush;
}
else
{
lbi.Background = lbProfiles.Background;
}
}
}
}
}