UWP:ItemsPanel 内的 ScrollViewer

UWP: ScrollViewer inside an ItemsPanel

我想创建一个数据透视表,将 DataBinding 绑定到数据透视表项列表。 这些项目中的每一个都应该被一个 ScrollViewer 包围。 不幸的是,它并不像我想的那样工作....

我的代码:

主页:

<Page
x:Class="PivotSample.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:PivotSample"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    <Pivot Title="Pivot" SelectedItem="{Binding CurrentPivotItem, Mode=TwoWay}" ItemsSource="{Binding PivotItems}">
        <Pivot.ItemTemplate>
            <DataTemplate>
                <ScrollViewer>
                    <UserControl Content="{Binding Content}"/>
                </ScrollViewer>
            </DataTemplate>
        </Pivot.ItemTemplate>
    </Pivot>
</Grid>

UserControl(第二个UserControl相同):

<UserControl
x:Class="PivotSample.MyUserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:PivotSample"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="400">

<StackPanel Background="Yellow">
    <TextBlock Text="Test" FontSize="30" HorizontalAlignment="Center"/>
    <TextBlock Text="Test" FontSize="30" HorizontalAlignment="Center"/>
    <TextBlock Text="Test" FontSize="30" HorizontalAlignment="Center"/>
    <TextBlock Text="Test" FontSize="30" HorizontalAlignment="Center"/>
    <TextBlock Text="Test" FontSize="30" HorizontalAlignment="Center"/>
    <TextBlock Text="Test" FontSize="30" HorizontalAlignment="Center"/>
    <TextBlock Text="Test" FontSize="30" HorizontalAlignment="Center"/>
    <TextBlock Text="Test" FontSize="30" HorizontalAlignment="Center"/>
    <TextBlock Text="Test" FontSize="30" HorizontalAlignment="Center"/>
    <TextBlock Text="Test" FontSize="30" HorizontalAlignment="Center"/>
    <TextBlock Text="Test" FontSize="30" HorizontalAlignment="Center"/>
    <TextBlock Text="Test" FontSize="30" HorizontalAlignment="Center"/>
    <TextBlock Text="Test" FontSize="30" HorizontalAlignment="Center"/>
    <TextBlock Text="Test" FontSize="30" HorizontalAlignment="Center"/>
    <TextBlock Text="Test" FontSize="30" HorizontalAlignment="Center"/>
    <TextBlock Text="Test" FontSize="30" HorizontalAlignment="Center"/>
    <TextBlock Text="Test" FontSize="30" HorizontalAlignment="Center"/>
</StackPanel>

视图模型:

public class ViewModelMainPage : ViewModelBase
{
    private IList<PivotItem> _pivotItems;
    private PivotItem _currentPivotItem;

    public IList<PivotItem> PivotItems
    {
        get { return _pivotItems; }
        set { _pivotItems = value; }
    }

    public PivotItem CurrentPivotItem
    {
        get { return _currentPivotItem; }
        set
        {
            OnPropertyChanged(nameof(CurrentPivotItem));
            _currentPivotItem = value;

        }
    }
}

当我启动项目时出现以下消息:“程序‘[2940] name.exe’已退出,代码为 -1 (0xffffffff)。

但是,当我用 Grid 或 StackPanel 替换 ScrollViewer 时,它会起作用,但我将看不到我的所有 PivotItem。

有什么想法吗?

(已过时,因为问题已更新)

您只能将 ItemControls 设置为 ItemsPanelTemplate 并且 Scrollviewer 不是 ItemsControl,而是 ContentControl(它只包装单个 child 并且不显示多个项目)。

此外,ItemsPanelTemplate 是您要实现的目标的错误目标:如果您想更改 Pivot 内 PivotItems 的内容,只需设置常规 ItemTemplate.

<Pivot>
  <Pivot.ItemTemplate>
    <DataTemplate>
      <ScrollViewer>
        <!-- your content display here -->
      </ScrollViewer>
    </DataTemplate>
  </Pivot.ItemTemplate>
</Pivot>

(提出一个新答案,因为问题已经改变了它的上下文。)

看起来 Pivot Control 搞砸了,如果你在它上面使用 PivotItems 的列表' s ItemsSource.

无论如何:这不是 DataBindings 的本意。

顾名思义,您绑定到 Data,而不是 controlsUI 元素PivotItems 是 UI 控件(虽然它们更符合逻辑而不是视觉表示)并且不应成为您的 ViewModel 的一部分。

只需将 ViewModel 中的类型更改为一些实际数据(字符串列表、对象列表或您创建的任何 类)即可正常工作

或者,如果您想在 Pivot Control 中放置固定内容,则根本不需要绑定它,只需将 PivotItems 直接放置在 Xaml:

<Pivot>
  <PivotItem Header="First Item">
    <!-- your content display here -->
  </PivotItem>
  <PivotItem Header="Secont Item">
    <!-- your content display here -->          
  </PivotItem>
</Pivot>