【问题标题】:Skip first item of ObservableCollection跳过 ObservableCollection 的第一项
【发布时间】:2016-06-30 10:59:51
【问题描述】:

我有一个带有可变数量项目的 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}">
...

【问题讨论】:

  • 请注意,绑定ItemsSource 属性时指定Mode=TwoWayUpdateSourceTrigger=PropertyChanged 没有意义。控件永远不会更改该属性。
  • 是的,你是对的。这只是一个示例,我将不同的代码组合在一起,以简单的方式展示我的问题。我忘了删除绑定的那部分。

标签: c# wpf xaml listbox


【解决方案1】:

您可以通过在AlternationIndex 附加属性上设置触发器来根据其索引隐藏ListBoxItem。您还必须为 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>

【讨论】:

  • 看起来又快又脏。但这就是我所期望的:)。工作正常,谢谢。但是那个 AlternationCount 是什么,为什么我要设置这么大的值?
  • 好的,我明白了。在这种情况下,每第 2147483647 个项目都会被折叠。如果我将 AlternationCount 设置为 2,则每隔一个项目就会折叠。对吗?
【解决方案2】:

最直接的方法是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&lt;&gt; 而不是 copy list (但在每个实例中使用相同的源)是一个好主意,取决于集合大小。然后您可以为迭代器实现自己的规则(例如,将跳过第一项的属性)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-17
    • 2019-03-03
    • 2022-06-24
    • 2018-03-09
    • 1970-01-01
    • 2014-06-07
    • 2013-08-17
    相关资源
    最近更新 更多