繁体   English   中英

LINQ表达式中的属性转换

[英]Property casting in linq expression

我有一个类表示ListViewItem模型,名为ItemViewModel ItemViewModel包含对象类型的属性Item。

接下来,我有一个名为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,这是我的View的一部分。

您正在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的方法是使用CollectionViewSourceMSDN链接 ),它可以在XAML中绑定和使用。 如果您的排序/分组是静态的,并且您不需要在运行时更改它,则此方法很好。

示例取自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的Source将是您可观察的集合。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM