我在XAML中有一个ItemsControl,我为每个组显示一个扩展器,这样我就可以扩展/折叠组.我想保持IsExpanded属性的状态(以及可能与组头的显示有关的其他设置).通常你只有一个包含属性的类并绑定到它.但是,该组的数据上下文是CollectionViewGroup.现在这个类不是很有帮助,因为它只给你Name属性和组中的项目(如果你只是想要一个标题,这可能很好,并且可能根据组中的项目数量或它们显示某种度量标准内容但不是,如果您只想存储有关组头UI状态的自定义数据).我想要做的是从这个类派生并将其他属性添加到我的派生类并绑定到它.但似乎没有任何简单的方法可以做到这一点.小组生成的所有细节似乎都隐藏在内部课程中,这非常令人沮丧.有没有人沿着实现ICollectionView自己的路线走下去(因此推测所有其他相关课程)?复制一切似乎是一项巨大的工作ListCollectionView只是为了能够创建一个自定义CollectionViewGroup类并绑定到它!谢谢.
我正在尝试使用CollectionViewSource实现一些组合框排序.此组合框实际上是数据模板的一部分,并在列表视图中重复.我的第一种方法似乎有效(使用CollectionViewSource),但我的所有组合框都共享相同的数据上下文.这使得每当其他一个盒子被改变时,所有其他盒子都改变以反映 - 而不是期望的副作用.
我决定退回并尝试使用内联xaml来实现一个基本的组合框(不在数据模板中)来指定CollectionViewSource(而不是将cvs创建为静态资源).我无法成功显示数据.因为我还是WPF的新手,所以我可能会完全错误.
这是我的组合框的xaml:
<ComboBox>
<ComboBox.ItemsSource>
<Binding>
<Binding.Source>
<CollectionViewSource Source="{Binding Path=Configurations}">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="AgencyName" />
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
</Binding.Source>
</Binding>
</ComboBox.ItemsSource>
</ComboBox>
Run Code Online (Sandbox Code Playgroud)
此组合框所在的用户控件的DataContext绑定到一个对象,该对象具有名为Configurations的ObservableCollection,并且每个配置都有一个名为AgencyName的属性.我已经证实使用没有cvs的标准绑定可以正常工作,所以我知道在那个协议中一切都很好.
任何帮助都会非常感激,因为我找不到我的老板的借口:).我也不想下载代码并在后面的代码中进行排序(我可以在构建ObservableCollection时使用,但是违反DRY原则的恕我直言).
我有一堆组合,它们都共享相同的可用选项。这些选择在从我的 ViewModel 公开的集合中提供。一切都很好,花花公子。
我现在希望对这些选择进行排序,因此我决定ICollectionView从我的 ViewModel公开 an而不是我通常的ReadonlyObservableCollection<T>,并在我的 ViewModel 中对集合视图进行排序。
class EditStuffViewModel : ViewModelBase
{
public EditStuffViewModel (ObservableCollection<Choice> choices)
{
Choices = new CollectionViewSource() { Source = choices }.View;
Choices.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));
}
public ICollectionView Choices
{
get;
private set;
}
//snip other properties
}
Run Code Online (Sandbox Code Playgroud)
这一切都很好,只是现在我所有的组合现在都同步了他们的选择。
这不是我想要的。我希望共享选择,但选择要与其正常绑定。我想我知道我的 CollectionView 正在跟踪选择,但我认为这是为每个控件选择的行为。
我已经尝试明确设置IsSynchronizedWithCurrentItem="False"我的组合,这成功地将它们解耦,但是我的绑定SelectedItem从未在组合中选择(调用了 ViewModel 的绑定 getter,但从未选择结果)。选择一个项目似乎可以正确更新我的 ViewModel 的 setter。
我显然错过了 CollectionView 应该如何工作的基本知识。任何人都可以启发我吗?
编辑:我不好,这确实适用于IsSynchronizedWithCurrentItem="False". 详情请看我的回答。
干杯。
我有一个集合,我需要3个不同的视图
1.所有收集数据
2.分组数据(分组标准将在应用程序生命周期中修改)
3.过滤数据(过滤条件将在应用程序生命周期中修改)
我想要的是所有视图都应该绑定到同一个集合,以便对集合的任何更改都应该同步到所有视图.
使用WPF,可以使用CollectionViewSource实现.
在Modern UI应用程序中,CollectionViewSource仍然存在,但功能有限.它没有SortDescription和FilterDescription.
如何在Modern UI应用程序中实现收集同步?
.net collectionviewsource microsoft-metro windows-runtime winrt-xaml
为什么没有 .Net 接口ICollectionView<T>?看着ICollectionView它似乎很明显的期待ICollectionView<T>。
我错过了什么吗?
我正在将ComboBox绑定到实体,但我希望过滤数据.
到目前为止,我尝试了两种方法:
我对第一种方法感到满意,首先是因为生成到数据库的查询包含WHERE子句,所以不是所有的数据都必须从远程数据库中检索....
但是,#2方法更灵活,如果在运行时我想更改应用的过滤...我已经按照msdn上的示例,但我得到一个例外,为什么?
所以,我的问题是:
1.哪种方法更好
2.为什么我得到例外?
这是我的代码:
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
//Do not load your data at design time.
if (!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this))
{
//Load your data here and assign the result to the CollectionViewSource.
System.Windows.Data.CollectionViewSource myCollectionViewSource =
(System.Windows.Data.CollectionViewSource)
this.Resources["tSCHEDEViewSource"];
// If I use this I get the data filtered on startup, but is it the right mode?
//myCollectionViewSource.Source = _context.TSCHEDE.Where(s => s.KLINEA == kLinea && s.FCANC == "T").OrderBy(s => s.DSCHEDA).OrderByDescending(s => s.DSTORICO); …Run Code Online (Sandbox Code Playgroud) 1.有什么区别之间CollectionViewSource,ICollectionView,ListCollectionView的IList的和BindingListCollectionView何时何地使用所有这些东西,我知道主要使用CollectionViewSource的,但即时通讯与何时使用这些不明确的,因为在XAML我使用CollectionViewSource的分组,排序等.当我想在codebehind中使用ListCollectionView时.我对这些事情感到困惑,请任何人解释一下激励差异以及何时使用.谢谢.
在我最近提出的另一个问题中,我被告知使用a CompositeCollection来访问各种来源ListBox.
该示例使用a XmlDataProvider来提供一些虚拟数据.但是,我有一个包含数据的视图模型.
我花了一些时间来绑定ListBox视图模型的数据.最终我明白了,但现在我想明白为什么我以前的方法不起作用.
成功的关键是CollectionViewSource.我最初的尝试是:
<CollectionContainer Collection="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.Movies}"/>
<CollectionContainer Collection="{Binding ElementName=Window, Path=DataContext.Movies}"/>
Run Code Online (Sandbox Code Playgroud)
我的想法是找到具有相应DataContext的Window,并绑定数据.你可以通过FindAncestor或通过ElementName,所以我尝试了两个.这对我来说似乎很合乎逻辑,但显然我错了.我运行应用程序时没有看到任何内容.
我还尝试绑定另一个具有数据上下文的控件; 例如StackPanel.
那么,为什么我不用1FindAncestor和ElementName1获取数据,但必须CollectionViewSource明确提供?
这是正在运行的代码.
<StackPanel DockPanel.Dock="Top">
<ListBox ItemTemplateSelector="{StaticResource CustomDataTemplateSelector}">
<ListBox.Resources>
<CollectionViewSource x:Key="ViewSource" Source="{Binding Movies}"/>
</ListBox.Resources>
<ListBox.ItemsSource>
<CompositeCollection>
<CollectionContainer Collection="{Binding Source={StaticResource ViewSource}}"/>
<CollectionContainer Collection="{Binding Source={StaticResource MyButtonsData}}"/>
</CompositeCollection>
</ListBox.ItemsSource>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel IsItemsHost="True"
Width="{Binding (FrameworkElement.ActualWidth),
RelativeSource={RelativeSource AncestorType=ScrollContentPresenter}}"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
1 …
我变得非常大ObservableCollection<MyItem>,我需要对它提供用户友好的过滤。
public static async Task RefilterViewAsync(this ItemsControl @this, Predicate<object> compareLogic)
{
await Task.Run(
() =>
{
var collectionView = CollectionViewSource.GetDefaultView(@this.ItemsSource);
if (collectionView.CanFilter)
{
collectionView.Filter = compareLogic;
}
else throw new InvalidOperationException("Filtering not supported...");
collectionView.Refresh();
});
}
Run Code Online (Sandbox Code Playgroud)
..问题是上面的代码由于某些原因不起作用。在 UI 线程上进行拟合大约需要 1 分钟。任何想法如何实现异步过滤,至少能够显示一些“处理..”动画来帮助用户克服这个问题?
我在LifeShaping过滤的PresentationFramework中得到一个空引用:
堆栈跟踪没有给我很多线索:
at System.Windows.Data.ListCollectionView.RestoreLiveShaping()
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
at System.Windows.Threading.DispatcherOperation.InvokeImpl()
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at MS.Internal.CulturePreservingExecutionContext.Run(CulturePreservingExecutionContext executionContext, ContextCallback callback, Object state)
at System.Windows.Threading.DispatcherOperation.Invoke()
at System.Windows.Threading.Dispatcher.ProcessQueue()
at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, …Run Code Online (Sandbox Code Playgroud) wpf ×8
c# ×5
data-binding ×2
.net ×1
.net-4.0 ×1
binding ×1
combobox ×1
filtering ×1
selecteditem ×1
winrt-xaml ×1