项目模板中的listview可视状态管理器(WinRT、Metro、XAML)

项目模板中的listview可视状态管理器(WinRT、Metro、XAML),xaml,windows-runtime,windows-store-apps,winrt-xaml,Xaml,Windows Runtime,Windows Store Apps,Winrt Xaml,我正在尝试获取一个列表视图,以显示由文本块组成的项目列表。。。 单击listview项时,我希望显示由文本框组成的列表 下面是我想出的,它不起作用。 我在模板中有两个网格,希望根据是否选中listview项来显示和隐藏网格。我哪里出错了 我将这些视觉状态从listview的模板中删除,但我必须承认我不确定它们是如何工作的,或者它们是如何被触发的。是否应该有一些代码来执行此操作 <ListView Grid.Row="2" ItemsSource="{Binding Lines}"

我正在尝试获取一个列表视图,以显示由文本块组成的项目列表。。。 单击listview项时,我希望显示由文本框组成的列表

下面是我想出的,它不起作用。 我在模板中有两个网格,希望根据是否选中listview项来显示和隐藏网格。我哪里出错了

我将这些视觉状态从listview的模板中删除,但我必须承认我不确定它们是如何工作的,或者它们是如何被触发的。是否应该有一些代码来执行此操作

    <ListView Grid.Row="2" ItemsSource="{Binding Lines}" HorizontalAlignment="Stretch">
        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid Name="Readonly">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="3*"/>
                        </Grid.ColumnDefinitions>

                        <TextBlock Text="{Binding One}" Grid.Column="0"/>
                        <TextBlock Text="{Binding Two}" Grid.Column="1"/>
                    </Grid>
                    <Grid Name="Editing" Visibility="Collapsed">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="3*"/>                            
                        </Grid.ColumnDefinitions>

                        <TextBox Text="{Binding One}" Grid.Column="0"/>
                        <TextBox Text="{Binding Two}" Grid.Column="1"/>
                    </Grid>
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="SelectionStates">
                            <VisualState x:Name="Selected">
                                <Storyboard>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Editing" Storyboard.TargetProperty="Visibility">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Readonly" Storyboard.TargetProperty="Visibility">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
                                    </ObjectAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

非常感谢,,
Kohan

我不知道视觉状态更改是否会传播,因此您的解决方案可能会以某种方式起作用,但我会在ListViewItem模板中编辑视觉状态(通过ItemContainerStyle)。

您正在渲染的项目外部设置情节提要动画。您指定的目标不仅不在外部页面的范围内,而且可能还不存在。因此,在呈现页面时无法设置情节提要

这是你想要做的

创建一个用户控件,该控件将表示您希望在
列表视图
项中使用的布局。定义
列表视图
时,请确保在
数据模板
中包含
用户控件
,如下所示:

<ListView>
        <ListView.ItemTemplate>
            <DataTemplate>
                <local:MyUserControl />
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView.ItemsPanel>
</ListView>

现在,对于
VisualStates
。您需要在
UserControl
中设置状态。这意味着编辑状态和查看状态。一个状态需要像这样进行本地化。想象一下
按钮
控件。按钮中的状态在每个
按钮中定义,而不是在某个共享位置

当您准备更改其中一项的状态时,需要将其连接到代码隐藏。在代码隐藏中,您需要循环查看
列表视图中的项,并调用您创建的方法,例如
MakeStateEdit()
MakeStateView()
。这些方法的实现将设置用户控件的状态。外部代码只是相信它会发生

这意味着您需要调用
VisualStateManager.GoToState(这个“编辑”,true)(或您创建的任何状态)位于
UserControl
中的代码隐藏中。相反,您可以在调用
MakeStateView()
时设置“视图”状态

要迭代
列表视图
属性,您需要使用如下技术()。你会发现,一旦你开始走这条路,其实并不复杂。您可能会感到失望,因为无法在XAML中完成所有这些。你不能。但这是可以做到的


祝你好运

通过在blend中提取listviewitem模板并使用其中的状态,我成功地使其工作。但这似乎有点过分了。我目前正在考虑使用ItemTemplateSelector,希望它能让我动态选择模板。不,选择器不允许你动态选择,对不起,你能解释一下你是如何让它工作的吗?我正在编辑ItemContainerStyle,在那里我可以找到VisualStates,然后我引用模板的网格,例如在您的示例“编辑”中,但我收到一个错误,说找不到它:\