在listview wpf C#donds'中隐藏列表视图项;行不通
我有以下在listview wpf C#donds'中隐藏列表视图项;行不通,c#,wpf,listview,C#,Wpf,Listview,我有以下ListView,其中包含以下XAML定义: <ListView Height="307" Width="991" Name="OrderListView" ItemsSource="{ Binding Orders }"> <ListView.ItemContainerStyle> <Style TargetType="ListViewItem"> <
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>
ListView未刷新,触发器不工作,某些项未隐藏
但是\u backup
包含的项目很少可见
设置为false
我的错在哪里
备注:
订单
不为null或空,在初始化窗口时从数据库加载。listview也不是空的,包含很少的记录(行)。首先,为类顺序实现接口INotifyPropertyChanged
(或实现该接口的基类)。使用界面提供的OnPropertyChanged
功能正确设置属性。这是必需的,因为当列表中某项的实例发生更改时,您的ObservableCollectionOrders
不会收到通知
这可能如下所示:
class Order : INotifyPropertyChanged
{
// Boilerplate code..
private bool _Visible ;
public bool Visible
{
get { return _Visible; }
set
{
if (_Visible == value) return;
_Visible = value;
OnPropertyChanged(() => _Visible);
}
}
}
此外,您应该为ObservableCollection订单实施相同的功能
您的TrutGeError应该在“代码>可见的//COD>属性更改时被激发。
您是否考虑简单地在基础集合视图上设置筛选器?根据您编写的内容,您可以消除触发器并在代码中处理过滤。您能否仅向我展示listview.datacontext的清晰文档?我发现datagridIt主要与数据上下文无关;在本例中,您将获取_backup.Orders的集合视图源,并将其强制转换到ListCollectionView中,然后在其上设置过滤器。非常直截了当。您甚至可以使用匿名委托。我在这里写了wiki标签,如果有用的话,OnPropertyChanged的定义是什么
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);
}
}
class Order : INotifyPropertyChanged
{
// Boilerplate code..
private bool _Visible ;
public bool Visible
{
get { return _Visible; }
set
{
if (_Visible == value) return;
_Visible = value;
OnPropertyChanged(() => _Visible);
}
}
}