c# - 通用应用程序中的动态表

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

我正在开发适用于 Windows Phone 8.1/Windows 8.1 的通用应用程序。我正在使用 MVVM 模式。我有一个包含动态数量的堆栈面板的表,这些面板绑定(bind)到 View 模型中的源。一个堆栈面板是表中的一行。如何使堆栈面板中的项目具有相同的宽度?我知道 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>

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

任何帮助将不胜感激(甚至是网格解决方案)。

最佳答案

StackPanel的宽度由其子级驱动。看起来 StackPanel 中有 3 个子级,这意味着它们不是动态生成的。您声明只有堆栈面板的数量发生变化。如果您不反对使用 Grid 而不是 StackPanel,则以下代码将起作用,因为 Grid 将自动拉伸(stretch)(采取所有允许的宽度),如果您创建宽度指定为百分比的列,则动态将该宽度向下滴到其子项:

<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>

关于c# - 通用应用程序中的动态表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30214044/

相关文章:

wpf - 对话wpf的MVVM定位

c# - 处理异步方法的取消

c# - WPF中TabControl的TabChanged事件

wpf - 为什么这么多 wpf 控件实现 CLR 属性而不是依赖属性?

wpf - 如何将 .NET framework 5.0 添加到 Visual Studio Professional 2019?

wpf - 我在哪里实例化我的 View 模型对象?

wpf - 使用服务定位器的 MVVM 模态对话框

c# - API 19 背景不透明

c# - 如何定义通用/模板化类,如下面的 C# 示例

c# - 为什么我不能使用 StateServer 在 2 个 Web 应用程序之间共享 session 状态?我错过了什么?