4

我试图让一个列表视图显示由文本块组成的项目列表...当单击列表视图项目时,我想显示一个由文本框组成的列表...

以下是我想出的,它不起作用。我在模板中有两个网格,并希望根据是否选择了列表视图项来简单地显示和隐藏网格。我哪里出错了?

我从列表视图的模板本身中提取了这些视觉状态,但我必须承认我不确定它们是如何工作的,或者它们是如何被触发的。是否应该有一些代码来做到这一点?

    <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>

非常感谢,科汉

4

2 回答 2

2

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

这就是你想要做的。

ListView创建一个用户控件,该控件将代表您在项目中想要的布局。定义 your 时ListView,请务必将 your 包含UserControl在 your 中DataTemplate,如下所示:

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

现在,对于VisualStates. 您需要在UserControl. 这意味着 Edit 的状态和 View 的状态。一个状态需要像这样本地化。想想Button控制。按钮中的状态是在每个Button非共享位置中定义的。

当您准备好更改其中一项的状态时,您需要将其连接到您的代码后面。在您后面的代码中,您需要遍历您的项目ListView并调用您创建的方法,例如MakeStateEdit()and MakeStateView()。设置用户控件状态的将是您对这些方法的实现。外部代码只是相信它会发生。

这意味着您需要在您的, 在代码隐藏中调用VisualStateManager.GoToState(this, "Edit", true);(或您创建的任何状态) 。UserControl相反,您可以在调用 时设置“查看”状态MakeStateView()

要迭代ListView Items属性,您需要使用这样的技术 ( http://blog.jerrynixon.com/2012/09/how-to-access-named-control-inside-xaml.html )。你会发现一旦你开始走这条路,它真的不是很复杂。您可能会对无法在 XAML 中完成所有这些操作感到失望。你不能。但这是可以完成的!

祝你好运!

于 2013-05-08T19:02:00.607 回答
0

我不知道视觉状态更改是否会传播,所以也许您的解决方案应该以某种方式工作,但我会改为编辑 ListViewItem 模板中的视觉状态(通过 ItemContainerStyle)。

于 2012-07-06T17:26:28.427 回答