使用ItemsControl拆分项目

时间:2012-09-27 13:29:00

标签: c# wpf xaml binding

这是XAML:

<ListView.View>
            <GridView>
                <GridViewColumn DisplayMemberBinding="{Binding Path=ScenarioName}" Header="Scenario Name" />
                <GridViewColumn DisplayMemberBinding="{Binding Path=ScenarioType}" Header="Scenario Type" />
                <GridViewColumn Header="Well names" Width="175">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel>
                                <ItemsControl ItemsSource="{Binding Path=Wells}">
                                    <ItemsControl.ItemsPanel>
                                        <ItemsPanelTemplate>
                                            <WrapPanel Orientation="Vertical"/>
                                        </ItemsPanelTemplate>
                                    </ItemsControl.ItemsPanel>
                                    <ItemsControl.ItemTemplate>
                                        <DataTemplate>
                                            <StackPanel>
                                                <!--<TextBlock Text="{Binding}"/>-->                                                  
                                                    <Button Width="60" Margin="0 0 0 3">Test 1</Button>

                                                </StackPanel>
                                        </DataTemplate>
                                    </ItemsControl.ItemTemplate>
                                </ItemsControl>
                            </StackPanel>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn DisplayMemberBinding="{Binding Path=StartPeriod}" Header="Start period" />
                <GridViewColumn DisplayMemberBinding="{Binding Path=EndPeriod}" Header="End period" />
                <GridViewColumn DisplayMemberBinding="{Binding Path=Lagged}" Header="Lagged" />
                <GridViewColumn DisplayMemberBinding="{Binding Path=Detrended}" Header="Detrended" />
                <GridViewColumn DisplayMemberBinding="{Binding Path=MinimumMonths}" Header="Length of continuous months" />
                <GridViewColumn DisplayMemberBinding="{Binding Path=CorrelatedWells}" Header="Correlated wells" />
                    <GridViewColumn Header="Excluded Wells">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <StackPanel>
                                    <ItemsControl ItemsSource="{Binding Path=ExcludedWells}">
                                        <ItemsControl.ItemsPanel>
                                            <ItemsPanelTemplate>
                                                <WrapPanel Orientation="Vertical"/>
                                            </ItemsPanelTemplate>
                                        </ItemsControl.ItemsPanel>
                                        <ItemsControl.ItemTemplate>
                                            <DataTemplate>
                                                <StackPanel>
                                                    <TextBlock Text="{Binding}"/>
                                                </StackPanel>
                                            </DataTemplate>
                                        </ItemsControl.ItemTemplate>
                                    </ItemsControl>
                                </StackPanel>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
        </ListView.View>
    </ListView>

它看起来像:

http://tinypic.com/view.php?pic=xpse8n&s=6

问题在于是否可以轻松地将Well1名称下的“Test1”按钮分组(分组,比如5个项目),因为井名的数量可能非常大,水平和垂直包装都没有帮助。

非常感谢, 利亚

3 个答案:

答案 0 :(得分:0)

您可以随时向ViewModel添加新属性

 public IEnumerable<Well> SomeWells
 { get { return Wells.Take(5); }

并更改您的ItemsSource绑定以改为使用它。

MSDN

上的示例

答案 1 :(得分:0)

您可以使用ListBox让用户滚动按钮,如:

<GridViewColumn Header="Well names" Width="175">
     <GridViewColumn.CellTemplate>
           <DataTemplate>
                <ListBox>
                     <ListBox.ItemTemplate>
                          <DataTemplate>
                               <Button></Button>
                          </DataTemplate>
                     </ListBox.ItemTemplate>
                </ListBox>
           </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

答案 2 :(得分:0)

我不是百分之百确定你要问的是什么,但听起来你想要连续5个按钮,并且每5个按钮自动换行到下一行。

要使其与WrapPanel一起使用,您应该为面板指定一个Width,其宽度为按钮的5倍,以便绘制其中的5个,然后换行到下一行

<ItemsPanelTemplate>
    <WrapPanel Width="300" Orientation="Vertical"/>
</ItemsPanelTemplate>

如果您提前知道按钮宽度,另一种方法是使用带有5列的UniformGrid。我认为您还需要将行计数设置为比您预期的集合更大的

<ItemsPanelTemplate>
    <UniformGrid Columns="5" Rows="100" />
</ItemsPanelTemplate>

定义行计数的另一种方法是在数据模型中公开一个属性,该属性包含您需要的行数,并将Rows属性绑定到该属性。

<ItemsPanelTemplate>
    <UniformGrid Columns="5" Rows="{Binding RowCount}" />
</ItemsPanelTemplate>

我不记得UniformGrid.Rows是否是DependencyProperty,但如果没有,那么你可以创建一个AttachedProperty代替你可以绑定并修改UniformGrid.Rows属性(例如,请参阅this code for Attached Properties for a Grid's Rows and Columns