![](/img/trans.png)
[英]ListView Highlight Selected Item Color is not staying on when selected other buttons
[英]ListView fails to highlight selected item on start
我目前正在為一個很奇怪的問題而苦苦掙扎,找不到原因。 我有一個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
,也可以重現此問題。 即使選中了它,它仍然不會突出顯示選中的項目,我很確定:
另外,當我這樣做時:
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");
}
}
我試過了:
如果我放置了此Loaded事件,它會起作用,但它是一個hack,我至少希望知道為什么它具有這種行為。 有小費嗎?
我用一些數據嘗試了您的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的Locator來設置窗口的數據上下文。 希望這有助於解決此問題...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.