在listview中隐藏列表视图项目wpf C#不起作用

时间:2014-04-15 21:14:55

标签: c# wpf listview

我有以下ListView,其中包含以下XAML定义:

<ListView Height="307" Width="991" Name="OrderListView" ItemsSource="{ Binding Orders }">
            <ListView.ItemContainerStyle>
                <Style TargetType="ListViewItem">
                    <Setter Property="HorizontalContentAlignment" Value="Center" />
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Path=isVisible}" Value="False">
                            <Setter Property="Visibility" Value="Collapsed"></Setter>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </ListView.ItemContainerStyle>
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="A header" DisplayMemberBinding="{Binding Path=StoreNumber}"></GridViewColumn>
                    ...
                </GridView>
            </ListView.View>
        </ListView>

与数据上下文链接的模型:

public sealed class DDModel : INotifyPropertyChanged
{
   public ObservableCollection<Order> Orders
   {
            get;
            set;
   }

   public event PropertyChangedEventHandler PropertyChanged;
}

和Order有一个布尔属性isVisible(参见样式触发器)

我在keyup上为文本框创建了一个事件:

private void OrderSearch_KeyUp(object sender, KeyEventArgs e)
{
    _backup = this.DataContext as DDModel;

    string keyword = this.OrderSearch.Text;

    var query = _backup.Orders.ToList();

    // make them all visible
    query.ForEach(p => p.isVisible = true);

    if (!string.IsNullOrWhiteSpace(keyword))
    {
        //then hide the items which doesn't match with keyword
        query.Where(p => !p.OrderNumber.ToString().StartsWith(keyword)).ToList().ForEach(p => p.isVisible = false);
    }
}

ListView未刷新,触发器无法正常工作且某些项目未被隐藏。

但是_backup包含的项目很少isVisible设置为false;

我的错误在哪里?

PS:Orders不为null或为空,在初始化窗口时从数据库加载。 listview也不是空的,包含很少的记录(行)。

1 个答案:

答案 0 :(得分:1)

首先,为类INotifyPropertyChanged实现接口Order(或实现该接口的基类)。使用界面提供的OnPropertyChanged功能正确设置属性。这是必需的,因为当列表中项目的实例发生更改时,您的ObservableCollection Orders不会收到通知。

这可能如下所示:

class Order : INotifyPropertyChanged
{
    // Boilerplate code..

    private bool _Visible ;

    public bool Visible
    {
        get { return _Visible; }
        set
        {
            if (_Visible == value) return;
            _Visible = value;
            OnPropertyChanged(() => _Visible);
        }
    }
}

此外,您应该为ObservableCollection Orders实现相同的功能。

Visible属性发生变化时,也应该触发你的触发器。