2017-03-01 114 views
0

我在XAML中定義了ItemsControl。WPF ItemsControl只顯示第一項

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"></RowDefinition> 
     <RowDefinition Height="Auto"></RowDefinition> 
     <RowDefinition Height="*"></RowDefinition> 
     <RowDefinition Height="*"></RowDefinition> 
    </Grid.RowDefinitions> 

    ... 

    <StackPanel Orientation="Horizontal" Grid.Row="2" Margin="5" MaxHeight="160"> 

     <ItemsControl Name="FilterItemsControl" ItemsSource="{Binding Filters}" > 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <GroupBox Header="{Binding Path=Key}" Margin="10,0,0,5" MaxWidth="150"> 
         <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"> 
          <ItemsControl ItemsSource="{Binding Path=Value}" > 
           <ItemsControl.ItemTemplate> 
            <DataTemplate> 
             <CheckBox Content="{Binding Path=Name}" IsChecked="{Binding Path=IsChecked}" Margin="1"/> 
            </DataTemplate> 
           </ItemsControl.ItemTemplate> 
          </ItemsControl> 
         </ScrollViewer> 
        </GroupBox> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 

    </StackPanel> 

    ... 

</Grid> 

視圖模型:

public Dictionary<string, ObservableCollection<CheckableItem>> Filters 
    { 
     get 
     { 
      return filters; 
     } 
     set 
     { 
      filters = value; 
      OnPropertyChanged("Filters"); 
     } 
    } 

而簡單的類CheckableItem:

public class CheckableItem 
{ 
    private long id; 
    private bool isChecked; 
    private string name; 

    public long Id 
    { 
     get { return id; } 
     set { id = value; } 
    } 

    public string Name 
    { 
     get { return name; } 
     set { name = value; } 
    } 

    public bool IsChecked 
    { 
     get { return isChecked; } 
     set { isChecked = value; } 
    } 
} 

過濾器字典正確填寫在視圖模型。另外Filters.Count大於1。 我想要顯示水平方向字典中的每個KeyValuePair,但只顯示字典中的第一項,爲什麼?

此外,代碼水平方向好嗎?

回答

2

把一個ScrollViewer一個StackPanel裏面是一個壞主意,因爲一個StackPanel措施,其子女有無限空間:

Horizontal scroll for stackpanel doesn't work

如果你想ItemsControl到水平佈局的項目,你應該設置它ItemsPanel到橫向StackPanel

試試這個:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"></RowDefinition> 
     <RowDefinition Height="Auto"></RowDefinition> 
     <RowDefinition Height="*"></RowDefinition> 
     <RowDefinition Height="*"></RowDefinition> 
    </Grid.RowDefinitions> 

    <ScrollViewer Grid.Row="2" Margin="5" ScrollViewer.HorizontalScrollBarVisibility="Auto"> 
     <ItemsControl Name="FilterItemsControl" ItemsSource="{Binding Filters}"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <StackPanel Orientation="Horizontal" /> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <GroupBox Header="{Binding Path=Key}" Margin="10,0,0,5" MaxWidth="150"> 
         <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"> 
          <ItemsControl ItemsSource="{Binding Path=Value}" > 
           <ItemsControl.ItemTemplate> 
            <DataTemplate> 
             <CheckBox Content="{Binding Path=Name}" IsChecked="{Binding Path=IsChecked}" Margin="1"/> 
            </DataTemplate> 
           </ItemsControl.ItemTemplate> 
          </ItemsControl> 
         </ScrollViewer> 
        </GroupBox> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </ScrollViewer> 
</Grid> 
+0

謝謝你的男人。對此,我真的非常感激。 – gzsun

相關問題