linq 表达式中的属性强制转换

本文关键字:转换 属性 表达式 linq | 更新日期: 2023-09-27 18:33:33

我有代表ListViewItem模型的类,名为ItemViewModelItemViewModel包含对象类型的属性项。

接下来,我有一个名为ListViewModel的类,具有属性ItemCollection<ItemViewModel>。现在我想按一些属性对ItemCollection中的值进行排序,这些属性是 Item 属性的属性。

在这种情况下,最好的铸造做法是什么?我可以这样做:

 ItemCollection= ItemCollection.OrderBy((lvItem) => SongModel(lvItem.Item).Title).ToArray());

但我认为必须有更好的解决方案。

public class ItemViewModel : INotifyPropertyChanged
{
    bool isSelected;
    public bool IsSelected
    {
        get
        {
            return isSelected;
        }
        set
        {
            if (value != IsSelected)
            {
                isSelected = value;
                RaisePropertyChanged("IsSelected");
            }
        }
    }
    object item;
    public event PropertyChangedEventHandler PropertyChanged;
    public object Item
    {
        get
        {
            return item;
        }
        set
        {
            item = value;
            RaisePropertyChanged("Item");
        }
    }
    private void RaisePropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

}

̈更新:很抱歉造成误会。ItemCollection 只是我的收藏的名称。实际上就我而言。ItemCollection 是 ObserverableCollection 的类型,所以我的 ItemCollection 没有任何属性,如 ItemCollection.SortDescriptions。ItemCollection 绑定到 ListView,它是 My View 的一部分。

linq 表达式中的属性强制转换

您正在ItemCollection<T>ICollection<T>界面上运行。但是ItemCollection<T>能够维护自己传入的原始数据的状态。

您想要的是将SortDescriptions设置为一个或多个排序条件。例如

ItemCollection.SortDescriptions.Add(
    new SortDescription("Title", ListSortDirection.Ascending));

但请记住,您的方法并不完全符合 MVVM,因为ItemCollection<T>CollectionView<T>是 WPF 框架的一部分,因此它们是"视图"的一部分。

当筛选条件更改并相应地更新内容时,应通知视图。

更新:此外,如果您使用ObservableCollection<T>绑定到列表,则在添加或删除新项目时,列表将自动重新排序/重新分组。

更新 2:

另一种更符合 MVVM 的方法是使用可在 XAML 中绑定和使用的CollectionViewSource(MSDN 链接(。如果您的排序/分组是静态的,并且您不需要在运行时更改它,则此方法可以正常工作。

示例取自 WPF 教程。

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Window.Resources>
        <CollectionViewSource Source="{Binding}" x:Key="customerView">
           <CollectionViewSource.GroupDescriptions>
               <PropertyGroupDescription PropertyName="Country" />
           </CollectionViewSource.GroupDescriptions>
        </CollectionViewSource>
    </Window.Resources>
    <ListBox ItemSource="{Binding Source={StaticResource customerView}}" />
</Window>

CollectionViewSource的来源将是您的可观察集合。

如果您需要动态/运行时确定排序参数,则可能需要更多工作。您可能必须使用附加行为或IValueConverter来完成它,但这超出了本答案的范围。