linq表达式中的属性转换

时间:2016-02-06 17:07:12

标签: c# linq mvvm

我有代表ListViewItem名为ItemViewModel的模型的类。 ItemViewModel包含object类型的属性Item。

接下来,我有一个名为ListViewModel的类,其属性为ItemCollection<ItemViewModel>。现在我想通过属性作为Item属性的属性在ItemCollection中对值进行排序。

在这种情况下,最佳演员表演是什么? 我可以这样做:

 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,它是我的View的一部分。

1 个答案:

答案 0 :(得分:0)

您正在使用ICollection<T>的{​​{1}}界面进行操作。但ItemCollection<T>能够保持其传入的原始数据的状态。

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

SortDescriptions

但请记住,您的方法并不完全符合MVVM,因为ItemCollection.SortDescriptions.Add( new SortDescription("Title", ListSortDirection.Ascending)); ItemCollection<T>是WPF框架的一部分,因此它们是&#34; View&#的一部分34 ;.

过滤条件更改时应通知视图并适当更新内容。

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

更新2:

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

取自WPF Tutorial的示例。

CollectionViewSource

<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来完成它,但这超出了此答案的范围。