WPF - ObservableCollection绑定失败 - .NET 4.0

时间:2010-11-26 17:15:45

标签: c# .net wpf observablecollection

快速摘要

  • 我的网格在我的应用程序的GUI中没有显示任何项目
  • 正确的列在触发时列在网格中(拾取集合类型)
  • CollectionChanged事件触发网格绑定的ObservableCollection
  • 输出窗口中没有绑定错误(成功绑定但未注册委托)

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.CollectionChangednull(即解析的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)

4 个答案:

答案 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的代码,回复,我可以把它放在我的网站上。