Windows Phone 8.1 ListView项目可见性取决于某些条件

时间:2015-07-07 14:45:14

标签: xaml listview windows-phone-8.1 winrt-xaml

我正在使用C#/ XAML开发Windows Phone 8.1应用程序。应用程序的主视图包含填充了项目的Windows.UI.Xaml.Controls.ListView类(某些搜索查询的结果)。

当用户点击某个项目时,应显示该项目的其他信息窗格( ExtendedInfoPanel ),但仅适用于项目(即仅一个项目一次应公开其他信息。)

我通过编辑默认<VisualStateGroup x:Name="SelectionStates">的副本来定制ItemContainerStyle,但没有成功。 这是我的代码(仅相关部分):

<Style x:Key="ListViewItemStyle1" TargetType="ListViewItem">
    <VisualStateGroup x:Name="SelectionStates">
        <VisualState x:Name="Unselected"/>
        <VisualState x:Name="SelectedUnfocused">
            <Storyboard>
                <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetProperty="Visibility" Storyboard.TargetName="ExtendedInfoPanel">
                    <DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>
                </ObjectAnimationUsingKeyFrames>
            </Storyboard>
        </VisualState>
    </VisualStateGroup>
</Style>
<ListView
    x:Name="myList"
    Margin="0,0,0,0"
    IsItemClickEnabled="False"
    ItemsSource="{Binding Source={StaticResource myDataSource}}"
    SelectionMode="Single"
    ItemTemplate="{StaticResource mySongDataTemplate}"
    ItemContainerStyle="{StaticResource ListViewItemStyle1}">
</ListView>

运行上面的代码段以Windows.UI.Xaml.UnhandledExceptionEventArgs异常结束,并在应用程序中引发消息:

  

无法解析TargetName ExtendedInfoPanel。

有人能给我一些提示,我怎样才能达到所需的行为?

1 个答案:

答案 0 :(得分:1)

如果在datatemplate中命名了元素,则无法通过该数据模板之外的名称访问它们。 Jerry Nixon解释了here的原因以及访问该元素的方法。

简而言之,您可以浏览可视树并找到您的ExtendedInfoPanel元素并更改其可见性。但是,在您的问题中,您说您只需要一个项目来显示它的详细信息。这意味着您应该在可视化树中搜索所有其他ExtendedInfoPanel元素并隐藏它们。这听起来不太有效。

我的方法会更像mvvm。在您的模型中,为将与ExtendedInfoPanel关联的类提供布尔IsVisible属性,并将其绑定到元素的可见性。

然后在列表的tap事件中,将tapped项的datacontext作为模型类,并为tapped元素和集合中的所有其他元素更改IsVisible属性。 提示:您将需要一个ObservableCollection,以便将更改传播到UI。或者,您需要实现INotifyPropertyChanged。