更改Observable Collection的项目显示(UI)/顺序

3

修改 #2:

    public void ReverseOrderRegBtns()
    {
        ICollectionView view = CollectionViewSource.GetDefaultView(GlobalObservableCol.regBtns);
        view.SortDescriptions.Add(new SortDescription("ReverseOrder", ListSortDirection.Ascending));
        view.Refresh();
    }

不太确定如何适应ICollectionView,它还会中断正在执行某些逻辑的计时器。由于某种原因,当创建按钮时,它会中断开始计数的定时器。

我的应用程序有几个计时器,因此创建的按钮每隔x秒就会更新可能的新内容。

编辑:

数据绑定如下:

<ListBox x:Name="lbRegistration" ItemsSource="{Binding regBtnsReverse, ElementName=Window}" Background="{x:Null}" 

原文: public ObservableCollection RegBtns { get { if (GlobalObservableCol.regBtns == null) { return new ObservableCollection(); } return GlobalObservableCol.regBtns; } }

新的代码(不再适用),相反的代码在ObserableCol类中

public ObservableCollection RegBtns { get { if (ObservableCol.RegBtns == null) { return new ObservableCollection(); } return ObservableCol.RegBtns; } }
public IEnumerable<RegistrationButton> RegBtns
        {
            get
            {
                return GlobalObservableCol.regBtnsReverse;
            }
        }

我已经在我的静态类中创建了IEnumerable,其中包含ObservableCollection列表。
当我的数据绑定是IENumerable时,我似乎无法进行绑定。如何将位于其他类中的NumbersReverse方法绑定到我的MainWindow.xls上?
我有一个ObservableCollection,其中包含自定义样式的WPF按钮。
这些项会动态创建并添加到自定义滑块控件(列表框)上。例如,Button 1、Button 2、Button 3等。
我想要的正好相反。
例如,Button 3、Button 2、Button 1。
这听起来像是一个链接列表,但是我的整个应用程序已经在整个逻辑中使用了这个Observable Collection。
当按钮在UI中显示时,最后添加的按钮应该放置在我的滑块(即列表框控件)的第一项。
我应该如何实现这一点?
谢谢, PeterP
3个回答

3
<ListBox ItemsSource="{Binding Foo}"/>

private ObservableCollection<RegButtton> RegBtns = new...;

public ICollectionView Foo { get; set; }

Foo = CollectionViewSource.GetDefaultView(RegBtns);
Foo.SortDescriptions.Add(new SortDescription("SomePropertyName", ListSortDirection.Ascending));
Foo.Refresh();

2

在您的代码中,应该有myCollection.Add(someButton)

将其替换为myCollection.Insert(0, myButton),然后您就完成了。


那确实可以替换第一个索引处的按钮,但我担心这会破坏我的整个逻辑。这样做后,我的程序将不再工作。 - PeterP
如果程序的其余部分依赖于按钮的顺序,那么像Michal所说的仅更改显示顺序绝对是最佳解决方案。 - stijn
这是一个设计问题。按照关注点分离范例或者采用n层模型,您不应该为了展示目的而修改数据。使用视图和/或适配器 - 在WPF中使用ViewModel。 - Jaster
好的观点,但在我看来取决于复杂性;例如,如果OP拥有一组按钮,仅仅是为了拥有一组按钮,并且除了显示它之外没有任何操作,那么我会接受这种方法。 - stijn

1

我不知道你使用的框架是什么。在我的视图模型中,我会这样做:

public ObservableCollection<int> Numbers { get; private set; }
public IEnumerable<int> NumbersReverse
{
    get
    {
        return Numbers.Reverse();
    }

}

我会使用NumbersReverse作为数据源:

<ListBox Name="listBox1" ItemsSource="{Binding NumbersReverse}"/>

当然,还有许多其他方法可以做到这一点。您必须确定在您的情况下最好的方法...

编辑: 例如,如果您不关心项目的顺序,那么stijn提供的解决方案要好得多。


我似乎无法在我的静态ObservableCollection <customBtn> 上执行.Reverse。 - PeterP
也许是因为您使用的是较旧版本的.NET框架。在.NET框架3.5中引入了IEnumerable<T>的反转功能。您可以更改框架的版本,或者创建另一个NumbersReverse属性,并在for循环中初始化它,将元素从最后一个插入到第一个,并将它们插入到新列表中。 - Michal B.
数据绑定发生在单例方法中,可能这就是我遇到问题的原因?当我使用IEnumerable替换该方法并数据绑定时,按钮没有显示出来。 - PeterP
更改通知会在这里出现问题。如果集合发生更改,您将无法收到通知。 - Jaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接