我想这样做,所以需要双击才能选择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;
}
}
}
}
}
答案 0 :(得分:3)
选择DoubleClick
上的项目的最简单方法是,如果ClickCount小于2,则将点击事件标记为Handled
这也可以让您保留Trigger
,将文字设置为Bold
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<EventSetter Event="PreviewMouseDown" Handler="ListBoxItem_PreviewMouseDown" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="FontWeight" Value="Bold" />
</Trigger>
</Style.Triggers>
</Style>
</ListBox.ItemContainerStyle>
private void ListBoxItem_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
if (e.ClickCount < 2)
e.Handled = true;
}
请注意,这会禁用ListBoxItem
上的所有单击事件。如果您想允许某些单击事件,则必须调整PreviewMouseDown
事件,以便不将特定点击标记为Handled
。