【问题标题】:Synchronize Sorted ListViewItems in View to ObservableCollection in ViewModel将 View 中的 Sorted ListViewItems 同步到 ViewModel 中的 ObservableCollection
【发布时间】:2011-05-08 01:58:32
【问题描述】:

我正在使用遵循 MVVM 设计模式的 C# WPF。目前我的视图有一个ListView,其中包含几列和几行(即ListViewItems)。

ViewModel 公开了一个 View 绑定到的 ObservableCollection<Person> 集合(如下所示)。

public ObservableCollection<Person> People
{
    get
    {
        return _people;
    }
    set
    {
        // new value?
        if( value != _people )
        {
            // Set
            _people = value;

            // Notify
            OnPropertyChanged( "People" );
        }
    }
}

这里是绑定sn-p

<ListView ItemsSource="{Binding People}" ... >
    <!-- Omitted -->
</ListView>

在视图中,用户可以单击列标题,ListView 将相应地自行排序。问题是 ViewModel 中的一些逻辑和命令对元素的顺序很敏感,当 ListView 在特定列上排序时,ViewModel 中的基础 People 集合不反映用户的顺序看到。

关于如何将ListView 中已排序的ListViewItems 与底层ObservableCollection&lt;Person&gt; 同步的任何线索?

编辑已经在 ListView ItemsSource 上尝试过 Mode=TwoWay,但没有成功。

【问题讨论】:

  • 这显然是设计为将您的视图耦合到应用程序的其他部分,即..通常不赞成使用 VM 或 M。

标签: c# wpf listview binding listviewitem


【解决方案1】:

问题是(正如您自己所说)ViewModel 中的一些逻辑和命令对元素的顺序很敏感。简而言之,它们不应该是;如果原因实际上是重新排序项目(几乎是我能想象到的唯一一个顺序很重要的地方),那么视图不应该按列排序。否则,您需要找到使订单无关紧要的方法-也许您可以举一个取决于项目顺序的操作示例?这样我们就可以提出真正的解决方案。

还想澄清一下,视图中项目的顺序与它们在源 ObservableCollection 中的顺序无关。通常,ItemsControls 会自动创建一个独立排序的 ICollectionView。编辑:是的,它不是一个实际的 ICollectionView,它是一个更复杂的机制(ItemCollection 与 ItemContainerGenerator 一起做的事情),但你明白了。

【讨论】:

  • 当用户尝试进行关键操作时,我们采纳了您关于“视图不应按列排序”的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 2012-11-15
  • 2011-08-22
  • 1970-01-01
  • 2015-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多