我有以下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也不是空的,包含很少的记录(行)。
答案 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
属性发生变化时,也应该触发你的触发器。