【问题标题】:wpf binding nested listwpf绑定嵌套列表
【发布时间】:2011-04-05 05:43:08
【问题描述】:

我正在尝试在列表视图中显示此嵌套列表。

例如,如果 EventItem 有响应,我需要在每个响应中重复事件名称 x 次。每个响应都有 3 个关联的复选框。

我要做的是在列表中显示:

事件名称 -> 响应选项 -> 努力复选框。

我不想使用树,因此列表单行。有任何想法吗?

更新:

假设我有 2 个事件,事件 1 有 2 个选项,事件 2 有 3 个选项。每个选项都有 3 个复选框。

我尝试显示数据的方式是这样的:

Event 1         Response A       [X]   [ ]   [ ]
Event 1         Response B       [ ]   [X]   [X]
Event 2         Response A       [X]   [X]   [X]
Event 2         Response D       [ ]   [ ]   [X]
Event 2         Response E       [X]   [X]   [X]

对于响应,我需要重复事件名称。

public class EventItem: DataAttributeChecked
{
    public EventItem(int primaryKey, string value) : base(primaryKey, value)
    {
        ResponseOptions = new List<ResponseOption>();
    }

    public List<ResponseOption> ResponseOptions { get; set; }
}

public class ResponseOption: DataAttribute
{
    public ResponseOption(int primaryKey, string value, int eventId) : base(primaryKey, value)
    {
        _eventId = eventId;
        LevelOfEfforts = new List<DataAttributeChecked>();
    }

    public List<DataAttributeChecked> LevelOfEfforts { get; set; }

    private readonly int _eventId;

    public int EventId
    {
        get { return _eventId; }
    }
}

<ListBox.ItemTemplate>
    <DataTemplate>
        <Border Margin="3" CornerRadius="2" BorderBrush="CadetBlue" BorderThickness="1">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"></ColumnDefinition>
                    <ColumnDefinition Width="*"></ColumnDefinition>
                    <ColumnDefinition Width="*"></ColumnDefinition>
                    <ColumnDefinition Width="*"></ColumnDefinition>
                </Grid.ColumnDefinitions>


                <StackPanel Grid.Column="0" Orientation="Horizontal">
                    <CheckBox IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}, Path=IsSelected}" />

                    <TextBlock Text="{Binding Value}" VerticalAlignment="Center"/>
                </StackPanel>

                <StackPanel Grid.Column="1" Orientation="Horizontal">
                    <TextBlock Text="{Binding ResponseOption.Value}" VerticalAlignment="Center"/>   
                </StackPanel>

                <StackPanel Grid.Column="2" Orientation="Horizontal">
                    <ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
                             ItemsSource="{Binding ResponseOptions.LevelOfEffort}" 
                             Name="lstOption" 
                             SelectionMode="Multiple" >

                        <ListBox.ItemsPanel>
                            <ItemsPanelTemplate>
                                <WrapPanel IsItemsHost="True" />
                            </ItemsPanelTemplate>
                        </ListBox.ItemsPanel>

                        <ListBox.ItemContainerStyle>
                            <Style TargetType="ListBoxItem">
                                <Setter Property="IsSelected" Value="{Binding Path=IsChecked, Mode=TwoWay}"/>
                            </Style>
                        </ListBox.ItemContainerStyle>

                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal" Margin="3,3,3,3">
                                    <CheckBox IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}, Path=IsSelected}" />
                                    <TextBlock Text="{Binding Value}" VerticalAlignment="Center"/>
                                </StackPanel>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>
                </StackPanel>

            </Grid>
        </Border>
    </DataTemplate>
                    </ListBox.ItemTemplate>

【问题讨论】:

  • 嗯。我打算建议您覆盖您的 ListBox 的 ItemsPanel 以水平显示其项目...但我看到您 正在 这样做。究竟什么不起作用?
  • 我刚刚用更好的描述更新了评论。
  • 你能说说什么不适合你吗?

标签: wpf list data-binding collections nested-lists


【解决方案1】:

如果列表是嵌套的,你就有了一棵树, 您可以使用 HierarchicalDataTemplate 并显示在 TreeView 或嵌套的 ListViews 中。

如果您想在平面列表中查看, 让您的 ViewModel 展平树, 假设您使用的是 MVVM 模式。

【讨论】:

  • 我没有在这个项目中使用 MVVM 模式。你还能如何使视图变平?我刚刚更新了原始问题。
  • 通过将您的设计更改为 MVVM :-) MVVM 的重点之一是能够通过引入 ViewModel 将 View 和 Model 的设计相互分离。
猜你喜欢
  • 2013-12-06
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
相关资源
最近更新 更多