代码之家  ›  专栏  ›  技术社区  ›  strager

将项目列表到网格中(不是网格视图)

  •  1
  • strager  · 技术社区  · 14 年前

    在我的WPF应用程序中,我有一个要绑定控件网格的集合。所需布局的示例( TL;DR我想从一个物品来源得到这个 ):

    Desired layout http://imagebin.ca/img/27UTke

    <Grid ShowGridLines="True">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>
    
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
    
        <Label Grid.Row="0" Grid.Column="0">FileUploader</Label>
        <ComboBox Grid.Row="0" Grid.Column="1" />
        <Button Grid.Row="0" Grid.Column="2">Edit</Button>
    
        <Label Grid.Row="1" Grid.Column="0">TextUploader</Label>
        <ComboBox Grid.Row="1" Grid.Column="1" />
        <Button Grid.Row="1" Grid.Column="2">Edit</Button>
    
        <Label Grid.Row="2" Grid.Column="0">UrlShortener</Label>
        <ComboBox Grid.Row="2" Grid.Column="1" />
        <Button Grid.Row="2" Grid.Column="2">Edit</Button>
    
        <Label Grid.Row="3" Grid.Column="0">ImageUploader</Label>
        <ComboBox Grid.Row="3" Grid.Column="1" />
        <Button Grid.Row="3" Grid.Column="2">Edit</Button>
    </Grid>
    

    这个例子有硬编码的值;我希望像使用ListView一样动态绑定集合。但是,使用带有GridView的ListView并不是我想要的;我不需要选择、标题、排序等。对用户来说,布局是一组整齐组织的选项,而不是网格中的数据集。


    我没能把这捆好。我尝试使用ItemsControl,但忽略了网格:

    Failed attempt 1 http://imagebin.ca/img/kTUordk

    <Grid ShowGridLines="True">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>
    
        <ItemsControl ItemsSource="{Binding MyData}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <ItemsControl>
                        <Label Grid.Column="0">Text here</Label>
                        <ComboBox Grid.Column="1" />
                        <Button Grid.Column="2">Edit</Button>
                    </ItemsControl>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Grid>
    

    我也在面板中使用了带有网格的ItemsControl,但这会为每个项创建一个网格,这很难看:

    Failed attempt 2 http://imagebin.ca/img/xHo__-JD

    <ItemsControl ItemsSource="{Binding Data}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <ItemsControl>
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <Grid ShowGridLines="True">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto" />
                                    <ColumnDefinition Width="*" />
                                    <ColumnDefinition Width="Auto" />
                                </Grid.ColumnDefinitions>
                            </Grid>
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
    
                    <Label Grid.Column="0" Content="{Binding Features}" />
                    <ComboBox Grid.Column="1" />
                    <Button Grid.Column="2">Edit</Button>
                </ItemsControl>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
    

    经过研究,发现了列和行网格定义的SharedSizeGroup属性。我已经在前面的尝试中尝试过了;但是,中间的列(宽度为 * )似乎没有调整自身大小以填充窗口的整个宽度:

    Failed attempt 3 http://imagebin.ca/img/nEoMJmy

    <ItemsControl ItemsSource="{Binding Data}" Grid.IsSharedSizeScope="True">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <ItemsControl>
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <Grid ShowGridLines="True">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto" SharedSizeGroup="A" />
                                    <ColumnDefinition Width="*" SharedSizeGroup="B" />
                                    <ColumnDefinition Width="Auto" SharedSizeGroup="C" />
                                </Grid.ColumnDefinitions>
                            </Grid>
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
    
                    <Label Grid.Column="0" Content="{Binding Features}" />
                    <ComboBox Grid.Column="1" />
                    <Button Grid.Column="2">Edit</Button>
                </ItemsControl>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
    

    最好的方法是什么 first layout ?

    1 回复  |  直到 14 年前
        1
  •  1
  •   strager    14 年前

    约翰伯恩写了一篇关于 pitfall of using * with SharedSizeGroups . 使用他建议的解决方法,我可以得到所需的布局:

    <Grid Name="grid">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" SharedSizeGroup="A" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="Auto" SharedSizeGroup="C" />
        </Grid.ColumnDefinitions>
    </Grid>
    
    <ItemsControl ItemsSource="{Binding Data}" Grid.IsSharedSizeScope="True">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <ItemsControl>
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <Grid ShowGridLines="True">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto" SharedSizeGroup="A" />
                                    <ColumnDefinition Width="{Binding ColumnDefinitions[1].Width, ElementName=grid}" />
                                    <ColumnDefinition Width="Auto" SharedSizeGroup="C" />
                                </Grid.ColumnDefinitions>
                            </Grid>
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
    
                    <Label Grid.Column="0" Content="{Binding Features}" />
                    <ComboBox Grid.Column="1" />
                    <Button Grid.Column="2">Edit</Button>
                </ItemsControl>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
    

    可悲的是,这看起来像一个黑客;我相信有更好的解决方案,实现我想要的。