我目前正在努力解决非常奇怪的问题而无法找到原因。
我有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,我想至少有一个理由说明为什么它会像那样。有什么提示吗?
答案 0 :(得分:0)
我用一些数据尝试了你的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 datacontext中的属性:
#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的定位器来设置窗口的数据上下文。 希望这有助于解决这个问题......