wpf绑定嵌套列表

问题描述:

我想在列表视图中显示这个嵌套列表。wpf绑定嵌套列表

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

我所试图做的是在列表中显示:

事件名称 - >响应选项 - >查看努力的邮箱。

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

UPDATE:

可以说我有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> 
+0

嗯。我会建议你重写ListBox的ItemsPanel来水平显示它的项目......但是我看到你*正在做这件事。什么不正确? – 2011-04-04 21:35:10

+0

我刚更新了更好的描述评论。 – nitefrog 2011-04-04 21:44:45

+0

你能提一下什么不适合你吗? – publicgk 2011-04-05 10:17:05

如果该列表是嵌套的,你有树, 对于您可以使用一个HierarchicalDataTemplate 并显示在一个TreeView或嵌套列表视图。

如果你想查看一个平面列表, 有你的视图模型扁平化树, 假设你使用的是MVVM模式。

+0

我没有在这个项目中使用MVVM模式。你还能如何将视野变平?我刚刚更新了原来的问题。 – nitefrog 2011-04-04 21:44:17

+0

通过将您的设计更改为MVVM :-)通过引入ViewModel,MVVM的一个主要特点是能够将View和Model的设计相互分离。 – 2011-04-05 10:35:35