快速摘要
MyView.xaml
.
.
.
<UserControl.Resources>
<xcdg:DataGridCollectionViewSource
x:Key="items"
Source="{Binding Path=Items}"
AutoFilterMode="And" >
</xcdg:DataGridCollectionViewSource>
</UserControl.Resources>
<xcdg:DataGridControl
Name="dataGrid"
ReadOnly="True"
ItemsSource="{Binding Source={StaticResource items}}"
.
.
.
MyView.xaml.cs构造函数
public MyView()
{
if (!DesignerProperties.GetIsInDesignMode(this))
DataContext = new MyViewModel().Tree;
initializeComponent();
}
MyViewModel.cs关键部分
public MyTree Tree { get; set; }
public MyViewModel()
{
Tree = new MyTree();
}
MyTree.cs关键部分
public ObservableCollection<Item> Items{ get; private set; }
public MyTree()
{
Items= new ObservableCollection<Item>();
Items.CollectionChanged += delegate { Console.WriteLine("Trigger"); };
}
每次添加和删除时都会打印触发器,但UI仍然认为该集合为空并且不知道更新。没有我的额外委托Items.CollectionChanged
是null
(即解析的Xaml不会导致将监听器添加到集合中)
DataGridCollectionViewSource
到
的ObservableCollection?很高兴提供更多细节,我试图从我的用例中抽象出问题的基础。集合的嵌套可能看起来很荒谬,但它基本上是树中节点的集合,以便更快地访问。
提前致谢!
修改
通过向我的Xaml添加PresentationTraceSources.TraceLevel=High
,我得到了更详细的输出。
ItemsSource="{Binding Source={StaticResource orders}, PresentationTraceSources.TraceLevel=High}"
我认为问题在于Default update trigger resolved to PropertyChanged
我希望默认为CollectionChanged
。我仍然不确定该怎么办。
BindingExpression (hash=43320496): Default mode resolved to OneWay
BindingExpression (hash=43320496): Default update trigger resolved to PropertyChanged
BindingExpression (hash=43320496): Attach to Xceed.Wpf.DataGrid.DataGridControl.ItemsSource (hash=9150720)
BindingExpression (hash=43320496): Resolving source
BindingExpression (hash=43320496): Found data context element: <null> (OK)
BindingExpression (hash=43320496): Use View from DataGridCollectionViewSource (hash=9026257)
BindingExpression (hash=43320496): Activate with root item <null>
BindingExpression (hash=43320496): Replace item at level 0 with <null>, using accessor {DependencyProperty.UnsetValue}
BindingExpression (hash=43320496): GetValue at level 0 from <null> using <null>: <null>
BindingExpression (hash=43320496): TransferValue - got raw value <null>
BindingExpression (hash=43320496): TransferValue - using final value <null>
BindingExpression (hash=43320496): Got PropertyChanged event from DataGridCollectionViewSource (hash=9026257) for View
BindingExpression (hash=43320496): Deactivate
BindingExpression (hash=43320496): Replace item at level 0 with {NullDataItem}
BindingExpression (hash=43320496): Use View from DataGridCollectionViewSource (hash=9026257)
BindingExpression (hash=43320496): Activate with root item DataGridCollectionView (hash=54545236 Count=0)
BindingExpression (hash=43320496): Replace item at level 0 with DataGridCollectionView (hash=54545236 Count=0), using accessor {DependencyProperty.UnsetValue}
BindingExpression (hash=43320496): GetValue at level 0 from DataGridCollectionView (hash=54545236 Count=0) using <null>: DataGridCollectionView (hash=54545236 Count=0)
BindingExpression (hash=43320496): TransferValue - got raw value DataGridCollectionView (hash=54545236 Count=0)
BindingExpression (hash=43320496): TransferValue - using final value DataGridCollectionView (hash=54545236 Count=0)
答案 0 :(得分:0)
如果您尝试将Grid直接绑定到Items
属性而不是CollectionViewSource
,该怎么办?如果可行,则问题在于CollectionViewSource
与您的集合的绑定,而不是网格与CollectionViewSource
的绑定。
答案 1 :(得分:0)
如果直接绑定到Items而不是使用静态源,它是否有效?
<xcdg:DataGridControl Name="dataGrid" ItemsSource="{Binding Path=Items}" />
我对静态项目源没有太多经验,但静态这个词让我觉得它是一次性绑定
答案 2 :(得分:0)
您必须设置Source
的{{1}}属性:
CollectionViewSource
答案 3 :(得分:0)
您可以尝试的是给CollectionViewSource一个名称,然后在后面的代码中使用数据加载后调用CollectionViewSource.View.Refresh()方法。
很多时候,问题是即使您将视图设置为ObservableCollection,CollectionViewSource也不会自动更新。
Web上有人为AutoRefreshingObservableCollection发布了一个很好的类,我一直在使用它并且效果很好。
尝试一下,让我知道它是否能解决您的问题。如果你需要,我也有AutoRefreshingObservableCollection的代码,回复,我可以把它放在我的网站上。