标签: collectionviewsource

如何从CollectionViewSource获取项目数?

我使用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)

c# wpf collectionviewsource

14
推荐指数
3
解决办法
2万
查看次数

每列的WPF DataGrid CustomSort

我有一个绑定到CollectionViewSource的WPF DataGrid,它封装了一个ObservableCollection.此CollectionViewSource有两个主要目标:

1)按T的特定属性对每个项目进行分组.我在GroupDescription中使用ValueConverter来获取我想要的分组行为.

2)通过a)主要对组名称(如上定义)和b)各个组项目对网格进行排序.我通过将自定义IComparer附加到CollectionViewSource的'CustomSort'属性来实现此目的.

这在大多数情况下都很有用,但是只要单击列标题,就会覆盖排序逻辑.我不想禁用排序,但是我想知道是否可以为特定列分配自定义排序顺序?

为了使事情更加清晰,假设用户单击"ColumnA" - 此时,我的CustomSorter封装的排序逻辑被覆盖,DataGrid现在按该属性排序.我宁愿颠倒CustomSorter的逻辑,而不是按所选属性进行排序.

.net c# wpf datagrid collectionviewsource

14
推荐指数
4
解决办法
2万
查看次数

在DataTemplate中绑定CollectionViewSource

'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的对象.

那么......我怎么才能看到正确的物体呢?

data-binding wpf datatemplate collectionviewsource

12
推荐指数
2
解决办法
5968
查看次数

在WPF中,您可以在没有代码的情况下过滤CollectionViewSource吗?

真的是这个主题说的一切.

<CollectionViewSource x:Key="MyData"
    Source="{Binding}" Filter="{ SomethingMagicInXaml? }" />
Run Code Online (Sandbox Code Playgroud)

并不是说我不能拥有代码.它只是唠叨我.

c# wpf xaml filter collectionviewsource

12
推荐指数
3
解决办法
2万
查看次数

如何在单个项目的属性更改时自动更新CollectionViewSource上的过滤器和/或排序顺序?

好的,所以这个问题与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

11
推荐指数
1
解决办法
5825
查看次数

在DataTemplate中排序绑定的ItemsControl(仅限XAML)

是否有一种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)

sorting wpf datatemplate itemscontrol collectionviewsource

10
推荐指数
2
解决办法
1万
查看次数

CollectionViewSource CurrentItem

我在对话框视图模型中使用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时,您通常如何处理当前项?

.net data-binding wpf collectionviewsource

10
推荐指数
1
解决办法
1万
查看次数

两个具有相同CollectionViewSource ItemSource的组合框相互更新

在我的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实现了修复,我只是想知道这是否正常)

data-binding wpf xaml collectionviewsource

9
推荐指数
1
解决办法
2454
查看次数

具有自定义排序的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上重用这个比较器?

vb.net sorting wpf collectionviewsource

8
推荐指数
1
解决办法
9822
查看次数

使用带有 HierarchicalDataTemplate 的 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 hierarchicaldatatemplate collectionviewsource

8
推荐指数
1
解决办法
3617
查看次数