4

テキストブロックで構成されたアイテムのリストを表示するリストビューを取得しようとしています...リストビューアイテムをクリックすると、代わりにテキストボックスで構成されたリストを表示したいと思います...

以下は私が思いついたものですが、うまくいきません。テンプレート内に 2 つのグリッドがあり、リストビュー項目が選択されているかどうかに応じて、グリッドを単純に表示および非表示にすることを望んでいました。どこで間違ったのですか?

リストビューのテンプレート自体からこれらの視覚的な状態を切り取ったのですが、それらがどのように機能するのか、またはどのようにトリガーされるのかがわからないことを認めなければなりません。これを行うには、コードの背後にある必要がありますか?

    <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

レンダリングされているアイテムの外側にストーリーボード アニメーションを設定しています。指定しているターゲットは、外側のページの範囲外であるだけでなく、まだ存在していない可能性があります。その結果、ページのレンダリング時にストーリーボードをセットアップできません。

これがあなたがしたいことです。

アイテムに必要なレイアウトを表すユーザー コントロールを作成しますListView。your を定義するときは、次のように your をListView必ず含めてください。UserControlDataTemplate

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

では、VisualStates. 内で状態を設定する必要がありますUserControl。これは、Edit の状態と View の状態を意味します。状態はこのようにローカライズする必要があります。Buttonコントロールを考えてください。Buttonボタンの状態は、一部の共有されていない場所ごとに定義されます。

いずれかの項目の状態を変更する準備ができたら、コード ビハインドに配線する必要があります。コード ビハインドでは、アイテムをループして、ListView作成したメソッドを呼び出す必要がMakeStateEdit()あります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

視覚状態の変更が伝播するかどうかはわかりません。そのため、ソリューションが何らかの形で機能するはずですが、代わりに (ItemContainerStyle を使用して) ListViewItem テンプレートで視覚状態を編集します。

于 2012-07-06T17:26:28.427 に答える