【发布时间】:2015-01-07 06:43:27
【问题描述】:
我有一个 UserControl 定义了一些 VisualStates:
<UserControl>
<Grid Height="50" HorizontalAlignment="Stretch">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="SelectionStates">
<VisualState x:Name="Unselected"/>
<VisualState x:Name="Selected">
<!-- more code -->
我将它用作我的 ListView 的 ItemTemplate。 When item from ListView is selected, I also want to change the VisualState of the DataTemplate.目前我有这样的方法:
private void list_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ListView listView = sender as ListView;
foreach (var item in e.AddedItems)
VisualStateManager.GoToState((listView.ContainerFromItem(item) as ListViewItem).ContentTemplateRoot as myControl, "Selected", false);
}
它似乎可以工作,但在某些情况下(listView.ContainerFromItem(item) as ListViewItem 是 null,因此会引发异常。
有没有其他/更好的方法来改变使用的DataTemplate的VisualState?
【问题讨论】:
-
所以您希望列表视图项设置的视觉状态也由您的 UserControl 中的 VSM 自动继承以反映它?只是为了确保我理解。
-
@ChrisW。是的,这是对的。例如,我的 UserControl 中有一个 TextBlock 并且视觉状态管理器将其更改为前景色。选择列表项后,我希望它触发。
-
而且你不能说它在哪些情况下不起作用?如果你发现了这一点,你很可能能够修复它。如果您提供一些示例解决方案,我可以检查一下。另外,我会使用
(cast)而不是as。 -
@yasen 正如我所观察到的,当我没有通过触摸屏幕来选择项目时,问题是(并非总是如此),而是当我从代码中选择项目时 - 例如通过将它们添加到 SelectedItems i> 或设置 IsSelected。明天我会尝试构建一个样本并给你一个标志。
-
您的
ListView需要虚拟化吗?它需要处理大量数据吗?
标签: c# windows xaml windows-phone-8.1