使用 ListBoxItem 上的简单触发器 IsMouseOver 绑定属性(数据触发器)

问题描述 投票:0回答:1

我看过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 是这个问题的原因......

我错过了什么吗?

c# wpf xaml caliburn.micro
1个回答
0
投票

要覆盖

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>
© www.soinside.com 2019 - 2024. All rights reserved.