C# wpf collectionview多重过滤器
我需要一些建议。我有两个ListView第一个ListView是“ListViewAlbums”,第二个是“ListViewTracks”。 ListViewTracks中的项目被组织为组。 ListViewAlbums设置为SelectionMode=“Extended”和行为:MultiSelectorBehaviours.SynchronizedSelectedEdItems。 当我从ListViewAlbums中选择多个项目时,我希望显示基于ALBUMID的ListViewTracks中的所有项目 我当前的代码: ListViewTracks组描述:C# wpf collectionview多重过滤器,c#,wpf,listview,collectionview,icollectionview,C#,Wpf,Listview,Collectionview,Icollectionview,我需要一些建议。我有两个ListView第一个ListView是“ListViewAlbums”,第二个是“ListViewTracks”。 ListViewTracks中的项目被组织为组。 ListViewAlbums设置为SelectionMode=“Extended”和行为:MultiSelectorBehaviours.SynchronizedSelectedEdItems。 当我从ListViewAlbums中选择多个项目时,我希望显示基于ALBUMID的ListViewTrac
PropertyGroupDescription groupDescription = new PropertyGroupDescription("AlbumID");
viewTrack.GroupDescriptions.Add(groupDescription);
viewTrack.SortDescriptions.Add(new System.ComponentModel.SortDescription("AlbumTitle", System.ComponentModel.ListSortDirection.Ascending));
viewTrack.SortDescriptions.Add(new System.ComponentModel.SortDescription("TitleTrack", System.ComponentModel.ListSortDirection.Ascending));
员工数据:
private ObservableCollection<EmployeesAlbums> _listAlbums = new ObservableCollection<EmployeesAlbums>();
public ObservableCollection<EmployeesTracks> _listTrack = new ObservableCollection<EmployeesTracks>();
public ObservableCollection<EmployeesTracks> PlayListTracks
{
get { return _listTrack; }
set { _listTrack = value; RaisePropertyChanged("PlayListTracks"); }
}
public ObservableCollection<EmployeesAlbums> PlayListAlbums
{
get { return _listAlbums; }
set { _listAlbums = value; RaisePropertyChanged("PlayListAlbums"); }
}
EmployeesAlbums model = new EmployeesAlbums
{
IdAlbums = int.Parse(rdr["Id"].ToString()),
TitleAlbum = rdr["TitleAlbums"].ToString(),
ArtistAlbum = rdr["ArtistAlbums"].ToString()
};
modelTracks = new EmployeesTracks
{
IdTrack = int.Parse(rdr["Id"].ToString()),
TitleTrack = rdr["TitleTrack"].ToString(),
PathTrack = rdr["Path"].ToString(),
AlbumTitle = rdr["AlbumTitle"].ToString(),
ArtistTrack = rdr["ArtistTrack"].ToString(),
AlbumID = int.Parse(rdr["AlbumId"].ToString()).ToString()
};
private ObservableCollection\u listAlbums=new ObservableCollection();
公共ObservableCollection_listTrack=新ObservableCollection();
公共可观测收集播放曲目
{
获取{return\u listTrack;}
设置{u listTrack=value;RaisePropertyChanged(“playlitTracks”);}
}
公共可观测收集播放列表
{
获取{return\u listAlbums;}
设置{u listAlbums=value;RaisePropertyChanged(“playlayAlbums”);}
}
员工模型=新员工模型
{
IdAlbums=int.Parse(rdr[“Id”].ToString()),
TitleAlbum=rdr[“TitleAlbums”]。ToString(),
ArtistAlbum=rdr[“ArtistAlbums”].ToString()
};
modelTracks=新员工名单
{
IdTrack=int.Parse(rdr[“Id”].ToString()),
TitleTrack=rdr[“TitleTrack”].ToString(),
PathTrack=rdr[“路径”]。ToString(),
AlbumTitle=rdr[“AlbumTitle”]。ToString(),
ArtistTrack=rdr[“ArtistTrack”]。ToString(),
AlbumID=int.Parse(rdr[“AlbumID”].ToString()).ToString()
};
选择ListViewAlbums的编辑项:
SelectionChangedItemsAlbumCommand = new GalaSoft.MvvmLight.CommandWpf.RelayCommand(SelectionChangedItemsAlbum);
private EmployeesAlbums _selectedPlayListFileAlbum;
public EmployeesAlbums SelectedPlayListFileAlbum
{
get { return _selectedPlayListFileAlbum; }
set
{
if (_selectedPlayListFileAlbum != value)
{
_selectedPlayListFileAlbum = value;
RaisePropertyChanged("SelectedPlayListFileAlbum");
}
}
}
private IEnumerable<EmployeesAlbums> _selectedPlayListFilesAlbums;
public IEnumerable<EmployeesAlbums> SelectedPlayListFilesAlbums
{
get { return this.selectedPlayListFilesAlbums; }
set { Set(ref selectedPlayListFilesAlbums, value); }
}
SelectionChangedItemsAlbumCommand=new-GalaSoft.MvvmLight.CommandWpf.RelayCommand(SelectionChangedItemsAlbum);
私人员工的唱片(u selected playlay filealbum);;
公共员工员工选择播放文件相册
{
获取{return _selectedPlayFileAlbum;}
设置
{
如果(_selectedplaylipfilealbum!=值)
{
_SelectedPlayFileAlbum=值;
RaisePropertyChanged(“SelectedPlayFileAlbum”);
}
}
}
私人IEnumerable\u选择播放文件相册;
公共IEnumerable Selected播放文件相册
{
获取{返回this.selectedPlayFilesAlbums;}
set{set(ref selectedplaylipfiles相册,值);}
}
筛选:
public string AlbumID { get; set; }
void SelectionChangedItemsAlbum()
{
foreach (var items in SelectedPlayListFilesAlbums)
{
ListCollectionView empView = CollectionViewSource.GetDefaultView(PlayListTracks) as ListCollectionView;
// Enable Live Filtering of the ListViewCollection
empView.IsLiveFiltering = true;
// Enable the filtering on AlbumID
empView.LiveFilteringProperties.Add("AlbumID");
AlbumID = items.IdAlbums.ToString();
// Filter based upon AlbumID
empView.Filter = new Predicate<object>(IsMatchFoundAlbums);
// Refresh Collection
empView.Refresh();
}
}
bool IsMatchFoundAlbums(object d)
{
bool res = false;
EmployeesTracks emp = d as EmployeesTracks;
if (emp.AlbumID == AlbumID)
{
res = true;
}
return res;
}
公共字符串AlbumID{get;set;}
void SelectionChangedItemsAlbum()
{
foreach(选定播放文件相册中的var项)
{
ListCollectionView empView=CollectionViewSource.GetDefaultView(播放曲目)作为ListCollectionView;
//启用ListViewCollection的实时筛选
empView.IsLiveFiltering=true;
//启用对AlbumID的筛选
empView.LiveFilteringProperties.Add(“AlbumID”);
AlbumID=items.IdAlbums.ToString();
//基于AlbumID的过滤器
empView.Filter=新谓词(IsMatchFoundAlbums);
//刷新集合
empView.Refresh();
}
}
布尔IsMatchFoundAlbums(对象d)
{
bool res=假;
EmployeesTracks emp=d作为EmployeesTracks;
if(emp.AlbumID==AlbumID)
{
res=真;
}
返回res;
}
XAML代码:
<ListView x:Name="ListViewTracks"
VirtualizingPanel.ScrollUnit="Pixel"
VirtualizingStackPanel.CacheLength="20,20"
VirtualizingStackPanel.CacheLengthUnit="Item"
ItemsSource="{Binding PlayListTracks}"
Style="{StaticResource CommonListViewStyleTracks}"
ItemContainerStyle="{DynamicResource styleListViewItem}"
>
<ListView.GroupStyle>
<GroupStyle>
<GroupStyle.Panel>
<ItemsPanelTemplate>
<VirtualizingStackPanel/>
</ItemsPanelTemplate>
</GroupStyle.Panel>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<StackPanel>
<ContentPresenter Content="{TemplateBinding ContentControl.Content}"
ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}"
ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}" />
<ItemsPresenter Margin="0,0,0,20" />
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate >
<Grid d:DesignWidth="460" Height="51">
<StackPanel>
<TextBlock DataContext="{Binding Items}" Text="{Binding AlbumTitle}" FontSize="18" TextTrimming="CharacterEllipsis" Foreground="{DynamicResource ItemsListViewForeground}"/>
<TextBlock DataContext="{Binding Items}" Text="{Binding ArtistTrack}" TextTrimming="CharacterEllipsis" Foreground="{DynamicResource AccentColorApps}"/>
</StackPanel>
</Grid>
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ListView.GroupStyle>
</ListView>
<ListView
x:Name="ListViewAlbums"
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.VirtualizationMode="Recycling"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding PlayListAlbums}"
SelectionMode="Extended"
SelectedItem="{Binding SelectedPlayListFileAlbum,UpdateSourceTrigger=PropertyChanged}" SelectionMode="Extended"
behaviours:MultiSelectorBehaviours.SynchronizedSelectedItems="{Binding SelectedPlayListFilesAlbums, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
Background="{x:Null}" Grid.Column="1" Grid.RowSpan="4"
ItemTemplate="{DynamicResource AlbumsDataTemplate}"
BorderBrush="{x:Null}"
>
<ie:Interaction.Triggers >
<ie:EventTrigger EventName="SelectionChanged">
<ie:InvokeCommandAction Command="{Binding SelectionChangedItemsAlbumCommand}"
CommandParameter="{Binding SelectedItem, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}"/>
</ie:EventTrigger>
</ie:Interaction.Triggers>
</ListView>
非常感谢 试试这个
在初始化属性PlayTracks后,立即执行以下操作:
ListCollectionView empView = CollectionViewSource.GetDefaultView(PlayListTracks) as ListCollectionView;
empView.Filter = IsMatchFoundAlbums;
让您的匹配方法为:
bool IsMatchFoundAlbums(object d)
{
EmployeesTracks emp = d as EmployeesTracks;
return SelectedPlayListFilesAlbums.Any(x => x.IdAlbums == emp.AlbumID);
}
... 你面临的问题是什么?非常感谢。你帮了我很大的忙