列表视图无法在启动时突出显示所选项目

本文关键字:显示 选项 项目 视图 启动 列表 | 更新日期: 2023-09-27 18:33:47

我目前正在与非常奇怪的问题作斗争,找不到原因。我有一个ListView

 <ListView ItemsSource="{Binding AvailableTestCaseDatas}" Grid.Row="2" Name="GListView" SelectedItem="{Binding SelectedTestCaseData, Mode=TwoWay}">
         <ListView.Resources>
            <Style TargetType="ListViewItem">
                <Style.Resources>
                    <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="{x:Static SystemColors.HighlightColor}"/>
                </Style.Resources>
            </Style>
        </ListView.Resources>
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding TestCaseName}"/>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

但是当它加载时,我看不到选定的项目,即使我很确定两个绑定都是正确的。此外,该项目似乎是在内部选择的,但 ListView 不会突出显示,因为当我单击所选项目时,ListView 不会突出显示它。当我单击列表中的其他项目时 - 单击的项目将突出显示,然后我可以选择在开始时选择的项目。

即使我从 XAML 中删除SelectedItem并尝试在加载事件时执行listView.SelectedIndex = 0,也可以重现该问题。它仍然没有突出显示所选项目,即使它被选中,我很确定:

  1. 列表。Items.Contains(list.选定项(;
  2. 列表。项目计数> 0

同样当我这样做时:

ctor {
        listView.Loaded += ListViewLoaded;
}
    void ListViewLoaded(object sender, System.Windows.RoutedEventArgs e)
    {
        var item = listView.SelectedItem;
        listView.SelectedIndex = -1;
        listView.SelectedItem = item;
    }

看起来非常奇怪,它开始工作了!

我的绑定:

    public TestCaseData SelectedTestCaseData
    {
        get { return _selectedTestCaseData; }
        set
        {
            _selectedTestCaseData = value;
            OnPropertyChanged("SelectedTestCaseData");
        }
    }

我试过了:

  1. 删除绑定,并检查代码问题。仍然复制。
  2. 确保代码中没有对此列表放置其他引用
  3. 启用列表(从一开始就禁用(
  4. 确保该列表。Items.Contains(list.SelectedItem( && list。项目计数> 0
  5. 删除样式和数据模板。

如果我放置这个 Loaded 事件,它可以工作,但这是一个黑客,我至少想要一个为什么它表现为那样的原因。有什么提示吗?

列表视图无法在启动时突出显示所选项目

我尝试了带有一些数据的 Xaml 代码并且工作正常,所以问题出在您第一次设置属性的方式上。最有可能的问题是SelectedItem在第一次被选中和取消选择,那里发生了一些奇怪的事情。我建议您在设置所选项目(您的SelectedTestCaseData(时显示代码,并在设置数据上下文和加载集合数据时显示代码。在这里,我将展示有效的代码,也许它会有所帮助:

相同的 XAML 但带有我的变量:

        <ListView ItemsSource="{Binding Persons}" Grid.Row="2" Name="GListView" SelectedItem="{Binding SelectedPerson, Mode=TwoWay}">
            <ListView.Resources>
                <Style TargetType="ListViewItem">
                    <Style.Resources>
                        <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="{x:Static SystemColors.HighlightColor}"/>
                    </Style.Resources>
                </Style>
            </ListView.Resources>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Name}"/>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

模型:

public class PersonViewModel : ViewModelBase
{
    #region Name
    private string _Name;
    private const string NameName = "Name";
    public string Name
    {
        get { return _Name; }
        set
        {
            Set(NameName, ref _Name, value);
        }
    }
    #endregion
}

MainViewModel 数据上下文中的属性:

    #region Persons
    private ObservableCollection<PersonViewModel> _Persons;
    public ObservableCollection<PersonViewModel> Persons
    {
        get { return _Persons ?? (_Persons = GetAllPersons()); }
    }
    private ObservableCollection<PersonViewModel> GetAllPersons()
    {
        var toRet = new ObservableCollection<PersonViewModel>();
        foreach (var i in Enumerable.Range(1,10))
        {
            toRet.Add(new PersonViewModel {Name = string.Format("Person Name {0}", i)});
        }
        //!!!!!!!!!!!!!!!!!!!!!HERE I SET THE SELECTED ITEM
        SelectedPerson = toRet.First();
        return toRet;
    }

    #endregion
    #region SelectedPerson
    private PersonViewModel _SelectedPerson;
    private const string SelectedPersonName = "SelectedPerson";
    public PersonViewModel SelectedPerson
    {
        get { return _SelectedPerson; }
        set
        {
            Set(SelectedPersonName, ref _SelectedPerson, value);
        }
    }
    #endregion

设置数据上下文的方式

<Window x:Class="..."
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    ...
    DataContext="{Binding Main, Source={StaticResource Locator}}">

在这种情况下,我是用于设置窗口数据上下文的 Mvvm ligth 定位器的用户。希望这有助于解决这个问题...