列表视图无法在启动时突出显示所选项目
本文关键字:显示 选项 项目 视图 启动 列表 | 更新日期: 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
,也可以重现该问题。它仍然没有突出显示所选项目,即使它被选中,我很确定:
- 列表。Items.Contains(list.选定项(;
- 列表。项目计数> 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");
}
}
我试过了:
- 删除绑定,并检查代码问题。仍然复制。
- 确保代码中没有对此列表放置其他引用
- 启用列表(从一开始就禁用(
- 确保该列表。Items.Contains(list.SelectedItem( && list。项目计数> 0
- 删除样式和数据模板。
如果我放置这个 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 定位器的用户。希望这有助于解决这个问题...