我想绑定到ObservableCollectionXAML中,并在那里应用分组.原则上,这很好.
<UserControl.Resources>
<CollectionViewSource x:Key="cvs" Source="{Binding Path=TestTemplates}">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="Title"/>
</CollectionViewSource.SortDescriptions>
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="TestCategory"/>
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
</UserControl.Resources>
Run Code Online (Sandbox Code Playgroud)
然后数据绑定表达式ItemsSource="{Binding Source={StaticResource ResourceKey=cvs}}"代替ItemsSource="{Binding Path=TestTemplates}".
起初,一切看起来都很酷,直到我想从视图模型中刷新UI.问题是,CollectionViewSource.GetDefaultView(TestTemplates)返回的视图与应用分组的XAML中的视图不同.因此,我无法设置选择或做任何有用的事情.
我可以通过将列表再次直接绑定到视图模型的属性并在代码隐藏中设置分组来修复它.但我对这个解决方案并不满意.
private void UserControlLoaded(object sender, RoutedEventArgs e)
{
IEnumerable source = TemplateList.ItemsSource;
var cvs = (CollectionView)CollectionViewSource.GetDefaultView(source);
if (cvs != null)
{
cvs.SortDescriptions.Add(new SortDescription("Title", ListSortDirection.Ascending));
cvs.GroupDescriptions.Add(new PropertyGroupDescription("TestCategory"));
}
}
Run Code Online (Sandbox Code Playgroud)
我认为,其原因已由John Skeet在此提供.
尽管如此,我希望应该有一种方法来获得正确的观点.我错了吗?
我在MVVM中为WPF DataGrid实现了CollectionViewSource的小型演示.我非常感谢任何帮助来验证实现并评论这是否是使用CollectionViewSource的正确方法.
public class ViewModel : NotifyProperyChangedBase
{
private ObservableCollection<Movie> _movieList;
public ObservableCollection<Movie> MovieList
{
get { return _movieList; }
set
{
if (this.CheckPropertyChanged<ObservableCollection<Movie>>("MovieList", ref _movieList, ref value))
this.DisplayNameChanged();
}
}
private CollectionView _movieView;
public CollectionView MovieView
{
get { return _movieView; }
set
{
if (this.CheckPropertyChanged<CollectionView>("MovieView", ref _movieView, ref value))
this.DisplayNameChanged();
}
}
public ViewModel()
{
MovieView = GetMovieCollectionView(MovieList);
}
private void DisplayNameChanged()
{
this.FirePropertyChanged("DisplayName");
}
public void UpdateDataGrid(string uri)
{
MovieView = GetMovieCollectionView(new ObservableCollection<Movie>(MovieList.Where(mov => uri.Contains(mov.ID.ToString())).ToList<Movie>()));
}
public …Run Code Online (Sandbox Code Playgroud) 无法绑定CollectionViewSource
DocProps是一个公共财产
public ObservableCollection<DocProp> DocProps1
Run Code Online (Sandbox Code Playgroud)
DataContext是自我的
DataContext="{Binding RelativeSource={RelativeSource self}}"
Run Code Online (Sandbox Code Playgroud)
这有效
<ListBox Grid.Row="0" Grid.Column="0" ItemsSource="{Binding Path=DocProps1}">
Run Code Online (Sandbox Code Playgroud)
我无法连接CollectionViewSource进行排序这甚至没有得到DocProps1
<ListBox Grid.Row="0" Grid.Column="0">
<ListBox.ItemsSource>
<Binding>
<Binding.Source>
<CollectionViewSource Source="{Binding Path=DocProps1}">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="Name" />
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
</Binding.Source>
</Binding>
</ListBox.ItemsSource>
Run Code Online (Sandbox Code Playgroud)
如何将CollectionViewSource绑定到公共属性?
谢谢
我有一个问题,在这里混合显示设计时数据是我的代码这是我的集合视图来源:
<CollectionViewSource
x:Name="DataSource"
Source="{Binding Groups}"
IsSourceGrouped="true"
ItemsPath="Items"
d:Source="{Binding ItemGroups, Source={d:DesignInstance Type=data:SampleData, IsDesignTimeCreatable=True}}"/>
Run Code Online (Sandbox Code Playgroud)
以及使用它的网格视图:
<GridView
x:Name="itemGridView"
ItemsSource="{Binding Source={StaticResource DataSource}}"
Run Code Online (Sandbox Code Playgroud)
我的问题是我只在VS11中看到了设计时间数据但在混合中没有看到.这是为什么?
谢谢
我对使用这些类型时数据绑定的工作方式感到有些困惑.
我读过你不能做以下事情
public partial class Window1 : Window
{
public ObservableCollection<string> Items { get; private set; }
public Window1()
{
Items = new ObservableCollection<string>() { "A", "B", "C" };
DataContext = this;
InitializeComponent();
}
}
<Window x:Class="WpfApplication25.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ComboBox>
<ComboBox.ItemsSource>
<CompositeCollection>
<CollectionContainer Collection="{Binding Items}"/>
</CompositeCollection>
</ComboBox.ItemsSource>
</ComboBox>
</Window>
Run Code Online (Sandbox Code Playgroud)
因为CompositeCollection没有datacontext的概念,因此使用绑定的任何内容都必须设置Source属性.如下:
<Window x:Class="WpfApplication25.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Window.Resources>
<CollectionViewSource x:Key="list" Source="{Binding Items}"/>
</Window.Resources>
<ComboBox Name="k">
<ComboBox.ItemsSource>
<CompositeCollection>
<CollectionContainer Collection="{Binding Source={StaticResource list}}"/>
</CompositeCollection>
</ComboBox.ItemsSource>
</ComboBox>
</Window>
Run Code Online (Sandbox Code Playgroud)
但那是怎么回事?它将源设置为某些东西,但是在某些情况下,CollectionViewSource使用datacontext(因为它没有明确设置源).
因为"list"是在Window的资源中声明的,这是否意味着它获取了Windows DataContext?在这种情况下,为什么以下也不起作用?
<Window x:Class="WpfApplication25.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Window.Resources> …Run Code Online (Sandbox Code Playgroud) wpf datacontext compositecollection collectionviewsource staticresource
当CompositeCollection的当前位置发生变化时,有没有办法得到通知?
我需要通过CollectionView监控CompositeCollection,任何想法都很受欢迎.
wpf observablecollection compositecollection collectionviewsource
我正在使用a CollectionViewSource来分组我的数据.在我的数据中,我有Property1并且Property2我需要分组.
唯一的规定是我不想要另一组的子组.因此,当我按这两个属性进行分组时,我不希望它Property2因为一个子组的Property1's group.
我想要这个的原因是因为我需要一个显示以下信息的标题:
标题:
<TextBlock.Text>
<MultiBinding StringFormat="Property1: {0}, Property2: {1}">
<Binding Path="Property1"/>
<Binding Path="Property2"/>
</MultiBinding>
</TextBlock.Text>
Run Code Online (Sandbox Code Playgroud)
我用我的CollectionViewSource尝试了这个,但是无法将组和子组"组合"在一起:
<CollectionViewSource x:Key="myKey" Source="{Binding myDataSource}">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="Property1" />
<PropertyGroupDescription PropertyName="Property2" />
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
Run Code Online (Sandbox Code Playgroud)
是否可以将两个属性组合在一起?像下面的东西?
<CollectionViewSource x:Key="myKey" Source="{Binding myDataSource}">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="Property1,Property2" />
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
Run Code Online (Sandbox Code Playgroud) 我有一个视图数据绑定通过mvvm光到我的WP7项目中的视图模型.该视图包含一个包含以下设置的列表框:
<ListBox x:Name="StationList"
ItemsSource="{Binding StationList}"
SelectedItem="{Binding SelectedStation, Mode=TwoWay}"
>
Run Code Online (Sandbox Code Playgroud)
StationList是一个ObservableCollection.
现在当视图加载时,一切看起来都很棒!显示列表,未选择任何项目!
但是,当我将XAML更改为:
<ListBox x:Name="StationList"
ItemsSource="{Binding Source={StaticResource StationListSorted}}"
SelectedItem="{Binding SelectedStation, Mode=TwoWay}"
>
Run Code Online (Sandbox Code Playgroud)
使用StationListSorted作为CollectionViewSource在StationList上进行简单的一个属性排序.现在事情变得丑陋!相同的视图在列表框中加载了相同的项目,但现在正确排序,但是选择了第一个项目并设置了selectedItem属性!
如何使用CollectionViewSource对ListBox进行排序而不自动选择我的第一个项目?
我有一个简单的ListView想要按数字或字母顺序,升序或降序对内容进行排序.选择来自下拉框.我知道我可以使用它CollectionViewSource来实现排序但是如何在运行中改变SortDescription或方向?
更新:
好的,所以我设置了我的CVS,viewModel就是ListView当前绑定的内容.我要求PropertyName绑定到当前选定的组合框项的属性PropertyName.组合框绑定到一个自定义列表,该列表显示我要排序的属性名称.
它抱怨我尝试使用的PropertyName:
无法在"SortDescription"类型的"PropertyName"属性上设置"绑定".'绑定'只能在DependencyObject的DependencyProperty上设置.
<CollectionViewSource Source="{StaticResource viewModel.ListValues}" x:Key="cvs">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="{Binding Path=SortPropertyName, Source=comboSort}"/>
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
<ListView ItemsSource="{Binding Source={StaticResource cvs}}" />
Run Code Online (Sandbox Code Playgroud) 我在XAML中有一个ItemsControl,我为每个组显示一个扩展器,这样我就可以扩展/折叠组.我想保持IsExpanded属性的状态(以及可能与组头的显示有关的其他设置).通常你只有一个包含属性的类并绑定到它.但是,该组的数据上下文是CollectionViewGroup.现在这个类不是很有帮助,因为它只给你Name属性和组中的项目(如果你只是想要一个标题,这可能很好,并且可能根据组中的项目数量或它们显示某种度量标准内容但不是,如果您只想存储有关组头UI状态的自定义数据).我想要做的是从这个类派生并将其他属性添加到我的派生类并绑定到它.但似乎没有任何简单的方法可以做到这一点.小组生成的所有细节似乎都隐藏在内部课程中,这非常令人沮丧.有没有人沿着实现ICollectionView自己的路线走下去(因此推测所有其他相关课程)?复制一切似乎是一项巨大的工作ListCollectionView只是为了能够创建一个自定义CollectionViewGroup类并绑定到它!谢谢.