跳过ObservableCollection的第一项

时间:2016-06-30 10:59:51

标签: c# wpf xaml listbox

我有一个ObservableCollection,其中包含可变数量的项目。我在ListBox内的TextBox中显示每个项目:

<ListBox ItemsSource="{Binding Collection, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
 <ListBox.ItemTemplate>
       <DataTemplate>
              <TextBox Label="{Binding Title}"/>
        </DataTemplate>
  </ListBox.ItemTemplate>

现在我想跳过ObservableCollection的第一项。我知道我可以/应该在我的ViewModel中做到这一点,但我想知道他们是否采用XAML方式来做到这一点。类似的东西:

<ListBox ItemsSource="{Binding Collection.Skip(0), Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
...

2 个答案:

答案 0 :(得分:2)

您可以通过在其ListBoxItem附加属性上设置触发器,根据其索引隐藏AlternationIndex。您还必须为AlternationCount属性设置足够大的值:

<ListBox ItemsSource="{Binding Collection}" AlternationCount="2147483647">
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Style.Triggers>
                <Trigger Property="ItemsControl.AlternationIndex" Value="0">
                    <Setter Property="Visibility" Value="Collapsed"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </ListBox.ItemContainerStyle>
    ...
</ListBox>

答案 1 :(得分:1)

最直接的方法是2个属性:

List<Item> _list = new List<Item>();

public ObservableCollection<Item> Collection => new ObservableCollection<Item>(_list);

public ObservableCollection<Item> Collection2 =>
    new ObservableCollection<Item>(_list.Skip(0));

这些可观察集合只存在于视图中(绑定将调用属性getter一次,为每个属性创建ObservableCollection。)

如果您更改_list,请通知更改两个属性以便更新视图:

_list.Add(new Item());
OnPropertyChanged(nameof(Collection));
OnPropertyChanged(nameof(Collection2));

在特定情况下,我认为你不能做别的事情。例如。 disabling item或使用项目模板对项目的显示方式进行其他一些更改是可能的,但完全删除项目......不要这么认为。至少不容易(自己的ContainerTemplate类型跳过第一项?)。

P.S。:也许实现自己的ObservableCollection<>不是copy list(但在每个实例中使用相同的源)是一个好主意,取决于集合大小。然后,您可以为迭代器实现自己的规则(例如,将跳过第一项的属性)。