2

私は現在、MVVM を使用して WPF で記述されたデータ駆動型の編集ツールに取り組んでいます。プライマリ ディスプレイはビュー モデルのスクロール可能なリストであり、その一部 (すべてではない) には、独自の子ビュー モデル (スクロール可能ではない) の内部リストがあります。問題は、ビュー モデル タイプの 1 つが、新しい子アイテムを追加する機能を含む配列タイプであり、それを使用すると、リスト全体がその新しいアイテムにスクロールされるようにしたいことです。MVVMを使用してこれを行う合理的な方法はありますか?

この UI が現在どのように設定されているかを示すために、これは全体的な表示です。

<Grid ScrollViewer.VerticalScrollBarVisibility="Auto">
  <Label Content="{Binding Path=DisplayName}" Height="28" HorizontalAlignment="Left" Margin="4,4,0,0" VerticalAlignment="Top" />
  <ItemsControl IsTabStop="False" ItemsSource="{Binding Path=VMEntries}" Margin="12,25,12,12" ItemTemplateSelector="{StaticResource EntryTemplateSelector}" ScrollViewer.VerticalScrollBarVisibility="Auto">
    <ItemsControl.Template>
      <ControlTemplate>
        <ScrollViewer x:Name="ScrollViewer">
          <ItemsPresenter />
        </ScrollViewer>
      </ControlTemplate>
    </ItemsControl.Template>
  </ItemsControl>
</Grid>

これは、使用している配列エントリのデータ テンプレートです。

<DataTemplate x:Key="Array">
  <Grid Margin="2,7,0,0">
    <Label Content="{Binding Path=DisplayName}" ToolTip="{Binding Path=Tooltip}"/>
    <Button Content="Add" HorizontalAlignment="Right" VerticalAlignment="Top"  Height="24" Width="24" Command="{Binding Path=AddCommand}"/>
    <ItemsControl HorizontalAlignment="Stretch" IsTabStop="False" ItemsSource="{Binding Path=SubEntries, NotifyOnSourceUpdated=True}" Margin="10,24,0,0" >
      <ItemsControl.ItemTemplate>
        <DataTemplate>
          <Grid HorizontalAlignment="Stretch">
            <Grid.ColumnDefinitions>
              <ColumnDefinition Width="Auto" />
              <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <Button Name="RemoveButton" Grid.Column="0" Margin="0,5,0,0" Content="Del" HorizontalAlignment="Right" VerticalAlignment="Top"  Height="24" Width="24" Command="{Binding Path=RemoveCommand}" CommandParameter="{Binding Path=.}"/>
            <ContentControl Grid.Column="1" Content="{Binding Path=.}"  ContentTemplateSelector="{StaticResource EntryTemplateSelector}" />
          </Grid>
          <DataTemplate.Triggers>
            <DataTrigger Binding="{Binding Path=RemoveHandler}" Value="{x:Null}">
              <Setter Property="Visibility" TargetName="RemoveButton" Value="Collapsed"/>
            </DataTrigger>
          </DataTemplate.Triggers>
        </DataTemplate>
      </ItemsControl.ItemTemplate>
    </ItemsControl>
  </Grid>
</DataTemplate>
4

1 に答える 1

0

MVVM の理想は、コード ビハインドを追加することではありませんが、いくつかの複雑なことについては、追加する方が簡単な方法です。アプリケーションに複雑な動作を追加し、MVVM を維持したい場合のいくつかのケースでは、代わりに動作 (使用を許可し、XAML からバインドする c# コード) を使用します。また、AttachedProperties を使用して動作を定義し、PropertyChanged イベントに登録することもできます。もう 1 つの方法は、UserControl を作成し、それにコード ビハインドを追加することです。

特定のケースでは、アイテムを追加するときに内部コレクションで何らかのイベントを発生させ、外部コレクションで次のようなものを実行する必要がありますlist.ScrollIntoView(itemToScroll);。これが先に進むためのヒントになることを願っています。

于 2012-11-15T20:54:19.840 に答える