通用应用程序中的动态表

时间:2015-05-13 11:53:58

标签: c# wpf mvvm win-universal-app stackpanel

我正在为Windows Phone 8.1 / Windows 8.1开发通用应用程序。我正在使用MVVM模式。我有一个动态数量的stackpanels表,它们在视图模型中绑定到source。一个堆栈面板是表中的一行。如何在堆叠面板中制作相同宽度的物品?我知道IsSharedSizeScope,但这在通用应用中的网格中不可用。

<ItemsControl Grid.Column="1" HorizontalAlignment="Stretch" 
            ItemsSource="{Binding PowerMaxiTableSource0, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <Border Background="{Binding IsEnabled, Converter={StaticResource BackgroundConverter}}">
                    <TextBlock Text="{Binding Text0}" />
                </Border>
                <Border Background="{Binding IsEnabled, Converter={StaticResource BackgroundConverter}}">
                    <TextBlock Text="{Binding Text1}" />
                </Border>
                <Border Background="{Binding IsEnabled, Converter={StaticResource BackgroundConverter}}">
                    <TextBlock Text="{Binding Text2}" />
                </Border>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Vertical" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

因为这是表我尝试使用网格而不是stackpanels,但我无法使其工作。我尝试了这个解决方案wpf grid with dynamic columns。但是我最终得到了在第0行,第0列中聚集的项目,即使在绑定属性中具有正确的值也是如此。

任何帮助都会非常感激(甚至是网格解决方案)。

1 个答案:

答案 0 :(得分:2)

StackPanel的宽度由其子女驱动。看起来StackPanel中有3个孩子,这意味着它们不是动态生成的。您声明只有堆栈面板的数量发生变化。如果您不反对Grid使用而不是StackPanel,则以下代码将起作用,因为Grid将自动拉伸(占用所有允许的宽度)并沿着该宽度逐渐减小如果您创建宽度指定为百分比的列,则动态显示给孩子:

<ItemsControl HorizontalAlignment="Stretch">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="33*"/>
                        <ColumnDefinition Width="33*"/>
                        <ColumnDefinition Width="33*"/>
                    </Grid.ColumnDefinitions>
                    <Border Grid.Column="0" Background="{Binding IsEnabled, Converter={StaticResource BackgroundConverter}}">
                        <TextBlock Text="{Binding Text0}" />
                    </Border>
                    <Border Grid.Column="1" Background="{Binding IsEnabled, Converter={StaticResource BackgroundConverter}}">
                        <TextBlock Text="{Binding Text1}" />
                    </Border>
                    <Border Grid.Column="2" Background="{Binding IsEnabled, Converter={StaticResource BackgroundConverter}}">
                        <TextBlock Text="{Binding Text2}" />
                    </Border>
                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>