簡體   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