【发布时间】:2014-11-11 07:32:43
【问题描述】:
我有一个ListView 和一个ItemSource 数据绑定和一个SelectedItem 数据绑定。
每次按下“下一个”或“上一个”按钮时,ListView 都会填充一个新的ItemSource。
SelectedItem 相应更新,ItemSource 中的项目具有Selected 状态,因此用户来回导航时可以记住它。
在调试时,一切似乎都运行良好。 VM 按预期更新控件,当我使用下一个和上一个按钮导航时,我还可以看到 ListView 具有正确的选定值。
问题是,无论 ListView 有正确的SelectedItem,ListView 都不会将SelectedItem 可视化为突出显示。
XAML:
<ListView
x:Name="_matchingTvShowsFromOnlineDatabaseListView"
Grid.Row="0"
Grid.Column="0"
Grid.RowSpan="3"
ItemsSource="{Binding AvailableMatchingTvShows}"
SelectedItem="{Binding AcceptedMatchingTvShow, Mode=TwoWay}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
ViewModel 中负责重新填充ItemSource 和SelectedItem 的行为:
private void UpdateForCurrentVisibleTvShow()
{
var selectedTvShow = FoundTvShows[CurrentTvShow];
// Update the available matches
var availableMatchingTvShows = new ObservableCollection<IWebApiTvShow>();
if (AvailableTvShowMatches[selectedTvShow] != null)
{
foreach (var webApiTvShow in AvailableTvShowMatches[selectedTvShow])
{
availableMatchingTvShows.Add(webApiTvShow);
}
}
AvailableMatchingTvShows = availableMatchingTvShows;
// Update the selected item
AcceptedMatchingTvShow = availableMatchingTvShows.FirstOrDefault(webApiTvShow => webApiTvShow.Accepted);
// Update the progress text
CurrentTvShowInfoText = string.Format(
"TV Show: {0} ({1} of {2} TV Shows)",
FoundTvShows[CurrentTvShow],
CurrentTvShow + 1,
FoundTvShows.Count);
// Update the AcceptedMatchingTvShow selection in the listview
OnPropertyChanged("AcceptedMatchingTvShow");
}
AcceptedMatchingTvShow的实现:
public IWebApiTvShow AcceptedMatchingTvShow
{
get
{
IWebApiTvShow acceptedTvShow = null;
if (FoundTvShows.Count > 0)
{
var tvShowName = FoundTvShows[CurrentTvShow];
acceptedTvShow = AvailableTvShowMatches[tvShowName].FirstOrDefault(webApiTvShow => webApiTvShow.Accepted);
}
return acceptedTvShow;
}
set
{
if (value != null)
{
var tvShowName = FoundTvShows[CurrentTvShow];
var currentlyAcceptedTvShow =
AvailableTvShowMatches[tvShowName].FirstOrDefault(webApiTvShow => webApiTvShow.Accepted);
if (currentlyAcceptedTvShow != null)
{
currentlyAcceptedTvShow.Accepted = false;
}
value.Accepted = true;
}
OnPropertyChanged();
}
}
我希望有人能指出我正确的方向。为了清楚起见,ListView 具有正确的项目,并且 SelectedItem 设置了正确的项目。
【问题讨论】:
-
在
this.UpdateLayout();后面的代码中试试,你可以在SelectionChanged event上调用它。您不会以这种方式更改VM中的任何内容,因此只有View会受到影响。 HTH -
你在哪里设置
AcceptedMatchingTvShow? -
@Sinatr 我也用那部分代码更新了问题。它没有需要更新的支持字段,它只需要再次读取属性并评估哪个电视节目是
Selectedone -
你的 OnPropertyChanged();不应该取更改的属性的名称吗?
-
@sexta13,那个
OnPropertyChanged方法可能在输入参数上声明了CallerMemberNameAttribute,所以它可以自动访问名称而无需传递它。
标签: c# wpf listview highlighting selecteditem