在ComboBox中显示依赖于属性的项目

时间:2011-06-22 12:10:04

标签: wpf binding combobox

我有一个绑定到List<Person>的组合框(在CodeBehind中设置了ItemsSource)。

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

所以所有人的姓名都会被添加到名单中。

因为没有必要在ComboBox中显示每个名字,所以我添加了Hide类型的属性bool。如果此属性设置为true,则名称不应显示在组合框中。

但是如何在组合框的Binding中添加一个条件,以便只列出那些不应被隐藏的人。

编辑: 关于答案,我添加了以下代码:

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

...

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

但是这会在collectionView.Filter = HideFilter;上抛出一个TargetInvocationException 我误解了什么?

4 个答案:

答案 0 :(得分:5)

您可以在后面的代码中进行过滤,也可以使用项目模板将Item的可见性绑定到isHiden属性(使用boolean to visilbility转换器)。您的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; }
}

答案 1 :(得分:2)

您需要在数据源的CollectionViewSource中添加一个过滤器,列表, 您可以使用静态方法CollectionViewSource.GetDefaultView(list)

获取此集合

你会得到一个很好的界面,你可以在其中添加一个说明(hide = false)

的过滤器

答案 2 :(得分:0)

您可以在列表中应用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  ;

答案 3 :(得分:0)

我的建议是不要这样做。为什么?没错,它会在组合框中产生空的折叠行! :/
就我而言,我有一个包含五个用户的列表并删除了所有用户。但是我仍然在组合框内部有五个小的可​​点击(!)行。 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>