我有一个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}">
...
答案 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(但在每个实例中使用相同的源)是一个好主意,取决于集合大小。然后,您可以为迭代器实现自己的规则(例如,将跳过第一项的属性)。