Как привязать только «некоторые» элементы списка к списку в WPF?

#c# #wpf #listview #row #height

Вопрос:

У меня есть такая модель:

 class MyImage
{
   public string imagePath {get; set;}
   public bool isIncluded {get; set;}
}
 

и список для хранения этих моделей:

 public List<MyImage> myImages {get; set;}
 

Теперь я знаю, как привязать весь этот список к ListView , но я хочу, чтобы ListView отображались только изображения тех моделей, в которых свойство «Включено» имеет значение true.

Мое текущее решение состоит в том, чтобы иметь другое List<MyImages> , в котором я копирую только те, которые включены, но мне было интересно, есть ли какое-либо лучшее решение.

Комментарии:

1. Вы ищете ListCollectionView фильтры и фильтры.

Ответ №1:

Вы можете просто скрыть элементы, которые должны быть исключены ListView в представлении, определив ItemContainerStyle с помощью DataTrigger :

 <ListView ...>
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Style.Triggers>
                <DataTrigger Binding="{Binding isIncluded}" Value="False">
                    <Setter Property="Visibility" Value="Collapsed" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ListView.ItemContainerStyle>
</ListView>
 

Ответ №2:

Используйте представление коллекции и примените фильтр…очень просто

 public ICollectionView SupportedDevices
    {
        get
        {
            if (Data != null)
            {
                return CollectionViewSource.GetDefaultView(Data);
            }
            else
                return null;
        }
    }

    private string _searchedText = string.Empty;
    public string SearchedText
    {
        get { return _searchedText; }
        set
        {
            _searchedText = value;

            SupportedDevices.Filter = delegate(object obj)
            {
                if (string.IsNullOrEmpty(_searchedText))
                    return true;

                DeviceInfo data = obj as DeviceInfo;
                if (data == null)
                    return false;

                return (
                    (data.Manufacturer.IndexOf(_searchedText, 0, StringComparison.InvariantCultureIgnoreCase) > -1) ||
                    data.Model.IndexOf(_searchedText, 0, StringComparison.InvariantCultureIgnoreCase) > -1
                    );
            };
        }
    }
 

Ответ №3:

Я не думаю, что вы можете избежать еще одного списка. Более элегантным решением может быть запрос LINQ на свойство:

public List<MyImage> MyImages => myImages.Where(i => i.IsIncluded).ToList();

Другим более сложным подходом может быть CollectionViewSource.