Отображать элементы в ComboBox в зависимости от свойства - PullRequest
2 голосов
/ 22 июня 2011

У меня есть поле со списком, которое привязано к List<Person> (ItemsSource установлен в CodeBehind).

<ComboBox Width="120" Background="White" DisplayMemberPath="Name" />

Таким образом, имена всех людей добавляются вList.

Поскольку не нужно показывать каждое имя в ComboBox, я добавил свойство Hide типа bool.Если для этого свойства установлено значение true, имя не должно отображаться в поле со списком.

Но как можно добавить условие для привязки списка со списком, чтобы в списке были указаны только те лица, которые недолжен быть скрыт.

РЕДАКТИРОВАТЬ: Что касается ответов, я добавил следующий код:

{
    List<Person> persons;
    ...
    var collectionView = CollectionViewSource.GetDefaultView(persons);
    collectionView.Filter = HideFilter;
}

...

private bool HideFilter(object item)
{
   Person p = item as Person;
   return p.Hide;
}

Но это создает исключение TargetInvocationException для collectionView.Filter = HideFilter;.
Что я неправильно понял?1020 *

Ответы [ 4 ]

5 голосов
/ 22 июня 2011

Вы можете либо фильтровать код позади, либо использовать шаблон элемента, чтобы связать видимость элемента со свойством isHiden (с преобразователем логического значения в видимость).Ваш код XAML будет:

     <ComboBox Grid.Column="1" Grid.Row="0" >
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Visibility="{Binding IsVisible}" Text="{Binding Name}"/>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>


public class person
{
    public person(string n, Visibility v)
    {
        Name = n;
        IsVisible = v;
    }
    public string Name {get;set;}
    public Visibility IsVisible { get; set; }
}
2 голосов
/ 22 июня 2011

Вам необходимо добавить фильтр в CollectionViewSource источника данных, ваш список, вы можете получить эту коллекцию статическим методом CollectionViewSource.GetDefaultView (list)

вы получите хороший интерфейс, где вы можете добавить фильтр, который говорит (скрыть = ложь)

1 голос
/ 22 сентября 2016

Мои предложения не делать это таким образом.Зачем?Это не так, , но создает пустые свернутые строки в выпадающем списке!: /
В моем случае у меня был список из пяти пользователей и все они удалены.Но у меня все еще было пять крошечных кликабельных (!) Рядов внутри поля со списком.oO

<ComboBox Grid.Column="1" Grid.Row="0" >
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Visibility="{Binding IsVisible}" Text="{Binding Name}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

Вместо этого я использую код, как показано ниже.Это мое решение для списка пользователей.Когда я отмечаю пользователя как удаленного (если выбран, нажмите кнопку, отметьте как удаленного), он полностью исчезает из списка.

<ComboBox ItemsSource="{Binding Path=UserList}"
        SelectedItem="{Binding SelectedUser}"
        DisplayMemberPath="Name"
        IsEnabled="{Binding SelectedUser.HasErrors, TargetNullValue=True, FallbackValue=True, ValidatesOnNotifyDataErrors=False, Converter={StaticResource Bool2BoolNot}}"
        IsEditable="False"
        >
    <ComboBox.ItemContainerStyle>
        <Style TargetType="ComboBoxItem">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=Deleted}" Value="True">
                    <DataTrigger.Setters>
                        <Setter Property="Visibility" Value="Collapsed"/>
                    </DataTrigger.Setters>
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=Special}" Value="True">
                    <DataTrigger.Setters>
                        <Setter Property="Foreground" Value="Red"/>
                    </DataTrigger.Setters>
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=Super}" Value="True">
                    <DataTrigger.Setters>
                        <Setter Property="Foreground" Value="DarkRed"/>
                    </DataTrigger.Setters>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ComboBox.ItemContainerStyle>
</ComboBox>
0 голосов
/ 22 июня 2011

вы можете применить запрос linq к списку, прежде чем сделать его источником

List<Person> persons = new List<Person> ();
var Filter =  from p in persons
           where p.hide == false
           select p;

Теперь обновите людей и предоставьте Фильтр в виде списка, приведите этот Фильтр в Список и определите его комбинированный источник ...

persons  = new List<Person>(Filter);
cbm.ItemSource = persons  ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...