【问题标题】:WPF ItemsControl display only first itemWPF ItemsControl 仅显示第一项
【发布时间】:2017-03-02 02:02:59
【问题描述】:

我在 XAML 中定义了 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 字典在 ViewModel 中正确填写。 Filters.Count 也大于一。 我想以水平方向显示字典中的每个 KeyValuePair,但只显示字典中的第一项,为什么?

另外,水平方向的代码可以吗?

【问题讨论】:

    标签: c# wpf datagrid itemscontrol


    【解决方案1】:

    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>
    

    【讨论】:

      猜你喜欢
      • 2011-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-09
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多