【问题标题】:Changing display (UI) / order of items Observable Collection更改显示(UI)/项目的顺序 Observable Collection
【发布时间】:2012-04-18 09:18:38
【问题描述】:

编辑#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}" 

旧: 公共 ObservableCollection RegBtns { 得到 { if (GlobalObservableCol.regBtns == null) { 返回新的 ObservableCollection(); } 返回 GlobalObservableCol.regBtns; } }

新的(不再有效),反之则在 ObserableCol 类中

public IEnumerable<RegistrationButton> RegBtns
        {
            get
            {
                return GlobalObservableCol.regBtnsReverse;
            }
        }

我在 ObservableCollection 列表可用的静态类中创建了 IEnumerable。

当我的数据绑定是 IENumerable 时,我似乎无法绑定。如何绑定 NumbersReverse 位于我的 MainWindow.xls 的其他类中的方法?


我有一个 ObservableCollection,其中包含自定义样式的 WPF 按钮。

这些项目被动态创建并添加到自定义滑块控件(列表框)上。 例如按钮 1、按钮 2、按钮 3、...

我想要的正是相反的

例如按钮 3、按钮 2、按钮 1。 这听起来像是一个链表,但我的整个应用程序已经在整个逻辑中使用了这个 Observable Collection。

当按钮显示在 UI 中时,最后添加的按钮应作为我的滑块上的第一项(即列表框控件)放置。

我究竟如何才能做到这一点?

谢谢, 彼得P

【问题讨论】:

    标签: c# .net wpf


    【解决方案1】:
    <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 ),就完成了。

      【讨论】:

      • 这实际上有效并替换了第一个索引处的按钮,但恐怕它破坏了我的整个逻辑。执行此操作时,我的程序不再工作。
      • 好吧,如果程序的其余部分取决于按钮的顺序,那么像 Michal 所说的那样只改变显示顺序绝对是最好的解决方案
      • 这是一个设计问题。我是关注范式分离或通过 n 层模型的方式,您不应该出于演示目的而修改数据。使用视图和/或适配器 - wpf 中的视图模型。
      • 好点,但取决于 imo 的复杂性;例如,如果 OP 有一个按钮集合只是为了有一个集合,并且除了显示它之外没有对集合做任何事情,我会对这种方法感到满意。
      【解决方案3】:

      不知道你用的是什么框架。我会在我的视图模型中做类似的事情:

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

      我会使用 NumbersReverse 作为数据源:

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

      当然还有很多其他方法可以做到这一点。您必须找出最适合您的情况...

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

      【讨论】:

      • 我似乎无法在我的静态 ObservableCollection 上做 .Reverse
      • 可能是因为您使用的是旧版本的 .NET 框架。 .NET 框架 3.5 中引入了 IEnumerable 上的反向。您可以更改框架的版本,也可以创建另一个 NumbersReverse 属性并在 for 循环中初始化它,将元素从最后一个到第一个,然后将它们插入到新列表中。
      • 数据绑定目前通过单例方法发生,也许这就是我遇到问题的原因?当我用 IEnumerable 和 databand 替换该方法时,我看不到任何按钮。
      • 更改通知会让你大吃一惊。如果集合发生变化,您将不会收到通知。
      猜你喜欢
      • 2018-11-09
      • 1970-01-01
      • 1970-01-01
      • 2011-10-15
      • 2023-03-15
      • 2012-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多