我看过SO上的多篇帖子,我正在使用其中一个经过验证的帖子(一个解决方案)作为我的解决方案(我已经适应了我的上下文),但是当我使用相同的东西时,它不好:
行
<Condition Binding="{Binding Path=IsMouseOver, RelativeSource={RelativeSource Self}}" Value="True"/>
似乎是问题所在,因为当我评论这一行时,所有空白行都变成小指,但我不明白为什么,逻辑似乎不错..
查看:
<UserControl x:Class="FTPserver.Views.FilesView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:cal="http://www.caliburnproject.org"
xmlns:local="clr-namespace:FTPserver.Views"
xmlns:converters="clr-namespace:FTPserver.Converters"
xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid>
<ListBox Name="Files" HorizontalContentAlignment="Stretch" SelectionMode="Extended" Tag="{Binding Tag}"
cal:Message.Attach="[Event SelectionChanged] = [Action OnSelectionChanged($source, $eventArgs)]"
SelectedIndex="{Binding SelectedIndex}" d:ItemsSource="{d:SampleData ItemCount=5}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="9*"/>
<ColumnDefinition Width="3*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding Name}" FontWeight="Bold" FontFamily="Courier New" VerticalAlignment="Center" />
<TextBlock Grid.Column="2" Text="{Binding Size}" Margin="5,0" FontWeight="Bold" FontFamily="Courier New" VerticalAlignment="Center" Foreground="Gray"/>
<TextBlock Grid.Column="1" Text="{Binding DateModified}" FontWeight="Bold" FontFamily="Courier New" VerticalAlignment="Center" Foreground="Blue"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=IsMouseOver, RelativeSource={RelativeSource Self}}" Value="True"/>
<Condition Binding="{Binding Name}" Value=""/>
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="LightPink"/>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ContextMenu>
<ContextMenu>
<MenuItem Header="Delete" cal:Message.Attach="Delete($dataContext)" />
</ContextMenu>
</ListBox.ContextMenu>
</ListBox>
</Grid>
</UserControl>
视图模型:
using Caliburn.Micro;
using FTPserver.Models;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Windows.Controls;
namespace FTPserver.ViewModels
{
public class FilesViewModel : Screen
{
public string? Tag { get; set; }
private MainViewModel? mainviewModel { get; set; }
public List<FileDetails>? SelectedItems { get; set; }
public BindableCollection<FileDetails>? Files {get;set;}
private FileDetails? _selectedFile { get; set; }
public FileDetails SelectedFile
{
get { return _selectedFile; }
set
{
Debug.WriteLine($"file: {value.Name}");
if (string.IsNullOrEmpty(value.Name))
{
SelectedIndex = -1;
NotifyOfPropertyChange(() => SelectedIndex);
return;
}
_selectedFile = value;
NotifyOfPropertyChange(() => SelectedFile);
}
}
private int _selectedIndex { get; set; }
public int SelectedIndex
{
get { return _selectedIndex; }
set
{
Debug.WriteLine($"index: {value}");
_selectedIndex = value;
NotifyOfPropertyChange(() => SelectedIndex);
}
}
public FilesViewModel(MainViewModel mainviewModel, string tag)
{
Tag = tag;
this.mainviewModel = mainviewModel;
Files = new BindableCollection<FileDetails>();
SelectedIndex = -1;
}
public void OnSelectionChanged(ListBox sender, SelectionChangedEventArgs e)
{
mainviewModel!.last_fileviewModel = this;
SelectedItems = sender.SelectedItems.Cast<FileDetails>().ToList()
.Where(t => !string.IsNullOrEmpty(t.Size) &&
long.TryParse(t.Size, out var n ) &&
n >= 0)
.ToList();
Debug.WriteLine($"changed: {string.Join(",", SelectedItems.Select(f => f.Name))}");
}
public void Delete(FilesViewModel item)
{
var files = item.SelectedItems.Cast<FileDetails>().ToList();
}
}
}
我的模特:
namespace FTPserver.Models
{
public class FileDetails
{
public string? Name { get; set; }
public string? Size { get; set; }
public string? DateModified { get; set; }
public bool IsNewer { get; set; }
public bool IsOlder { get; set;}
public bool? IsEqual { get; set; }
}
}
图像结果:
当鼠标悬停在名称为空的项目上时,我正在等待以突出显示小指,但不,它始终是默认颜色。 我不认为 calibburn 是这个问题的原因......
我错过了什么吗?
要覆盖
ListBoxItem
的突出显示颜色,您必须覆盖其 ControlTemplate
。这是因为控件的本机视觉交互反馈是使用 VisualStateManager
(这是推荐的方式)而不是样式触发器来实现的。
<ListBox ItemsSource="{Binding DataItems}"
DisplayMemberPath="TextData">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<ContentPresenter />
</Border>
<ControlTemplate.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}"
Value="True" />
<Condition Binding="{Binding Name}"
Value="" />
</MultiDataTrigger.Conditions>
<Setter Property="Background"
Value="LightPink" />
</MultiDataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>