c# - MVVM 嵌套列表滚动

标签 c# wpf list mvvm

我目前正在开发一个数据驱动的编辑工具,该工具是使用 MVVM 在 WPF 中编写的。主要显示是一个可滚动的 View 模型列表,其中一些(不是全部)具有自己的 subview 模型(不可滚动)的内部列表。问题在于,其中一种 View 模型类型是一种数组类型,其中包含添加新子项的功能,我们希望这样做,以便在您使用它时将整个列表滚动到该新项。有没有一种合理的方法可以使用 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>

最佳答案

MVVM 的理想是不在后面添加代码,但是对于一些复杂的东西,更简单的方法是添加它。在某些情况下,如果您想在应用程序上添加复杂的行为并保留 MVVM,另一种方法是使用 Behaviors(允许使用并从 XAML 绑定(bind)的 c# 代码)。您还可以使用 AttachedProperties 定义行为并注册到 PropertyChanged 事件。另一种方法是创建一个 UserControl 并将代码添加到其中。

在您的特定情况下,内部集合必须在向其添加项目时引发一些事件,然后在您的外部集合中执行类似这样的操作 list.ScrollIntoView(itemToScroll);。希望这可以提供一些提示。

关于c# - MVVM 嵌套列表滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13402724/

相关文章:

c# - 路易斯异常 : Operation returned an invalid status code 'Forbidden'

c# - WPF 中的图像变得模糊

java - 在 Java 中实现自己的 List、Stack、Queue 或其他数据结构的原因

c# - 在 StackPanel 中设置项目间距的简单方法是什么?

wpf - 带有 XML 模型和 LinqToXml 的 MVVM?

c# - LINQ:根据属性比较两个列表并返回符合特定条件的项目

java - 在无参数构造函数中绕过最大数组大小

c# - 从关闭的 NetworkStream 中读取不会导致任何异常

c# - 学习有关数据驱动应用程序的 OOP 设计模式的资源

c# - 如何给文本框一个 17.5 厘米的固定宽度?