我使用CollectionViewSource来过滤ListBox中显示的记录.xaml如下.
<Window x:Class="WPFStarter.ListBoxItemsFilter.ListBoxFilterUsingCollectionViewSource"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Name="userControl"
Title="ListBoxFilterUsingCollectionViewSource" Height="300" Width="300">
<Window.Resources>
<CollectionViewSource Source="{Binding ElementName=userControl, Path=DataContext.Items}"
x:Key="cvs" Filter="CollectionViewSource_Filter"/>
</Window.Resources>
<StackPanel Orientation="Vertical">
<TextBox x:Name="txtSearch" TextChanged="txtSearch_TextChanged"/>
<TextBlock x:Name="txtSummary" Grid.Column="0" HorizontalAlignment="Right" VerticalAlignment="Bottom" FontSize="8"></TextBlock>
<ListBox ItemsSource="{Binding Source={StaticResource cvs}}" DisplayMemberPath="First"/>
</StackPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)
这是我的代码behing(请不要介意这个代码隐藏,在真实的应用程序中我使用最好的MVVM来实现这个场景).
public partial class ListBoxFilterUsingCollectionViewSource : Window
{
private string _text="";
private readonly CollectionViewSource _viewSource;
public ListBoxFilterUsingCollectionViewSource()
{
InitializeComponent();
_viewSource = this.FindResource("cvs") as CollectionViewSource;
}
private void CollectionViewSource_Filter(object sender, FilterEventArgs e)
{
var character = e.Item as Character;
e.Accepted = character != null && character.First.ToLower().Contains(_text.ToLower()); …Run Code Online (Sandbox Code Playgroud) 我有一个绑定到CollectionViewSource的WPF DataGrid,它封装了一个ObservableCollection.此CollectionViewSource有两个主要目标:
1)按T的特定属性对每个项目进行分组.我在GroupDescription中使用ValueConverter来获取我想要的分组行为.
2)通过a)主要对组名称(如上定义)和b)各个组项目对网格进行排序.我通过将自定义IComparer附加到CollectionViewSource的'CustomSort'属性来实现此目的.
这在大多数情况下都很有用,但是只要单击列标题,就会覆盖排序逻辑.我不想禁用排序,但是我想知道是否可以为特定列分配自定义排序顺序?
为了使事情更加清晰,假设用户单击"ColumnA" - 此时,我的CustomSorter封装的排序逻辑被覆盖,DataGrid现在按该属性排序.我宁愿颠倒CustomSorter的逻辑,而不是按所选属性进行排序.
'ContentTemplate'是一个DataTemplate,它显示一个具有成员'FooList'(ObservableCollection)的对象.
<DataTemplate x:Key="ContentTemplate">
<ListBox ItemsSource="{Binding Path=FOO}">
...
</ListBox>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
我需要能够使用CollectionViewSource过滤该FooList.这通常是直截了当的,但我似乎无法使绑定在DataTemplate中工作.我试图这样做:
<DataTemplate x:Key="ContentTemplate">
<DataTemplate.Resources>
<CollectionViewSource x:Key="CVS" Source="{Binding Path=FooList}" Filter="FooFilter"/>
<DataTemplate.Resources>
<ListBox ItemsSource="{Binding Source={StaticResource CVS}}">
Run Code Online (Sandbox Code Playgroud)
我从中得到的错误是:
System.Windows.Data错误:2:找不到目标元素的管理FrameworkElement或FrameworkContentElement.BindingExpression:路径= FooList; 的DataItem = NULL; target元素是'CollectionViewSource'(HashCode = 52991666); target属性是'Source'(类型'Object')
这听起来像是在寻找CollectionViewSource上的'FooList'而不是绑定到DataTemplate的对象.
那么......我怎么才能看到正确的物体呢?
真的是这个主题说的一切.
<CollectionViewSource x:Key="MyData"
Source="{Binding}" Filter="{ SomethingMagicInXaml? }" />
Run Code Online (Sandbox Code Playgroud)
并不是说我不能拥有代码.它只是唠叨我.
好的,所以这个问题与Windows Phone 7/Silverlight(更新的WP7工具,2010年9月)有关,特别是过滤底层ObservableCollection<T>.
在使用WP7模板Pivot控件应用程序时,我遇到了一个问题,即更改一个底层项目ObservableCollection<T>,不会导致屏幕上的ListBox被更新.基本上,示例应用程序有两个枢轴,第一个直接绑定到底层ObservableCollection<T>,第二个绑定到a CollectionViewSource(即,表示底层的过滤视图ObservableCollection<T>).
正在添加到ObservableCollection<T>工具的基础项INotifyPropertyChanged,如下所示:
public class ItemViewModel : INotifyPropertyChanged
{
public string LineOne
{
get { return _lineOne; }
set
{
if (value != _lineOne)
{
_lineOne = value;
NotifyPropertyChanged("LineOne");
}
}
} private string _lineOne;
public string LineTwo
{
get { return _lineTwo; }
set
{
if (value != _lineTwo)
{
_lineTwo = value;
NotifyPropertyChanged("LineTwo");
}
}
} private string _lineTwo;
public bool IsSelected …Run Code Online (Sandbox Code Playgroud) collections silverlight filter collectionviewsource windows-phone-7
是否有一种XAML方法可以根据项目的某个属性自动对绑定项目(ViewModel对象列表)ItemsControl进行排序.ItemsControl是DataTemplate的一部分.我认为CollectionViewSource可以解决这个问题,但是如何将CollectionViewSource绑定到ItemsControl.以下代码没有任何表现:
<--xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"-->
<DataTemplate DataType="{x:Type vm:Company}">
<DataTemplate.Resources>
<CollectionViewSource x:Key="viewSource" Source="{Binding Employees}">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="ID" />
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
</DataTemplate.Resources>
<Viewbox>
<ItemsControl ItemsSource="{Binding Source={StaticResource viewSource}}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</Viewbox>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud) 我在对话框视图模型中使用CollectionViewSource,它具有各种过滤要求,工作正常.我还维护了属性(SelectedProject)中所选项目的等价物,我想知道是否可以/应该取消它,因为View将知道当前项目.我的数据绑定看起来像:
<ListView
ItemsSource="{Binding Projects.View}"
IsSynchronizedWithCurrentItem="True"
SelectedItem="{Binding SelectedProject, Mode=TwoWay}">
Run Code Online (Sandbox Code Playgroud)
我使用SelectedProject的setter来促进单元测试,并且就我所见,CurrentItem似乎不可设置.当我想使用它时,我还需要将它强制转换为正确的对象.OTOH,如果 SelectedProject是冗余的,那么我会向它显示与任何其他冗余相同的尊重并删除它.
那么,当您使用CollectionViewSource时,您通常如何处理当前项?
在我的ViewModel上,我有2个属性(都实现了属性更改通知):
CountryOfIssue
Nationality
Run Code Online (Sandbox Code Playgroud)
在我的View上,我有一个指向我的Entity Framework上下文的本地实例的CollectionViewSource:
<CollectionViewSource x:Key="cvsCountries" Source="{Binding LocalContext.Countries}" CollectionViewType="{x:Type ListCollectionView}">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="Name" />
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
Run Code Online (Sandbox Code Playgroud)
同样在这个页面上,我有两个组合框用于设置CountryOfIssue和国籍的值:
<ComboBox IsEnabled="{Binding CanEditCountryOfIssue}" ItemsSource="{Binding Source={StaticResource cvsCountries}}" DisplayMemberPath="Name" SelectedValuePath="Id" SelectedItem="{Binding CountryOfIssue, Mode=TwoWay, UpdateSourceTrigger=LostFocus, ValidatesOnDataErrors=True}" />
<ComboBox IsEnabled="{Binding CanEditNationality}" ItemsSource="{Binding Source={StaticResource cvsCountries}}" DisplayMemberPath="Name" SelectedValuePath="Id" SelectedItem="{Binding Nationality, Mode=TwoWay, UpdateSourceTrigger=LostFocus, ValidatesOnDataErrors=True}" />
Run Code Online (Sandbox Code Playgroud)
通过这种设置,每当我改变其中一个组合框的值时,另一个也会改变...这是预期的行为吗?
(我已经使用另一个CollectionViewSource实现了修复,我只是想知道这是否正常)
我是WPF的新手,我在尝试使用自定义排序对CollectionViewSource进行排序时遇到了困难.情况如下:
我有一个使用参数调用的SearchView,它变成了它的datacontext,如下所示:
mainView.SetGlobalOverlay(New SearchView With {.DataContext = interventionViewModel})
Run Code Online (Sandbox Code Playgroud)
在SearchView.xaml中,然后我将CollectionViewSource绑定到集合:
<CollectionViewSource x:Key="UnitsCollection"
Filter="UnitsCollection_Filter"
Source="{Binding Path=Units}" />
Run Code Online (Sandbox Code Playgroud)
现在,我已经在另一个共享类中实现了IComparer接口.此比较器用于源代码中其他位置的ListCollectionView,并且工作正常.现在,我如何在CollectionViewSource上重用这个比较器?
您将如何将 CollectionViewSource(用于提供排序行为)与 HierarchicalDataTemplate 的 ItemsSource 结合使用?
因此,鉴于下面的代码,我如何对层次结构中每个级别的子级应用排序?
<HierarchicalDataTemplate DataType="{x:Type l:CommandGroup}"
ItemsSource="{Binding Children}">
<HierarchicalDataTemplate.ItemContainerStyle>
<Style TargetType="{x:Type MenuItem}"
BasedOn="{StaticResource {x:Type MenuItem}}">
<Setter Property="Command"
Value="{Binding Command}" />
<Setter Property="CommandParameter"
Value="{Binding}" />
</Style>
</HierarchicalDataTemplate.ItemContainerStyle>
<TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>
Run Code Online (Sandbox Code Playgroud)
我以为我可能能够执行以下操作,但它使后代无法显示并产生以下绑定错误。
<HierarchicalDataTemplate DataType="{x:Type l:CommandGroup}">
<HierarchicalDataTemplate.ItemsSource>
<Binding>
<Binding.Source>
<CollectionViewSource Source="{Binding Children}" />
</Binding.Source>
</Binding>
</HierarchicalDataTemplate.ItemsSource>
<HierarchicalDataTemplate.ItemContainerStyle>
<Style TargetType="{x:Type MenuItem}"
BasedOn="{StaticResource {x:Type MenuItem}}">
<Setter Property="Command"
Value="{Binding Command}" />
<Setter Property="CommandParameter"
Value="{Binding}" />
</Style>
</HierarchicalDataTemplate.ItemContainerStyle>
<TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement …Run Code Online (Sandbox Code Playgroud) wpf ×9
c# ×3
data-binding ×3
.net ×2
datatemplate ×2
filter ×2
sorting ×2
xaml ×2
collections ×1
datagrid ×1
itemscontrol ×1
silverlight ×1
vb.net ×1