Mvvm 当ItemsSource属性更改时,DataGrid未重新绘制

Mvvm 当ItemsSource属性更改时,DataGrid未重新绘制,mvvm,silverlight-4.0,datagrid,Mvvm,Silverlight 4.0,Datagrid,我的可导航Silverlight应用程序中有一个类似于以下内容的页面(已删除专有引用): 最初填充绑定到ItemSource属性的集合时,不会重新绘制DataGrid。集合是一种直接从observateCollection继承的类型,以便用集合包装其他属性(即IsBusy和ShowEmpty)。每当我使用或调整DataGridUI的列大小时,数据就会显示出来,因此这肯定是一个重绘问题。这就好像控件本身中有一个bug。我使用的是一个MVVM解耦模型,但我非常接近于直接在DataGrid上对本页

我的可导航Silverlight应用程序中有一个类似于以下内容的页面(已删除专有引用):


最初填充绑定到
ItemSource
属性的集合时,不会重新绘制
DataGrid
。集合是一种直接从
observateCollection
继承的类型,以便用集合包装其他属性(即
IsBusy
ShowEmpty
)。每当我使用或调整
DataGrid
UI的列大小时,数据就会显示出来,因此这肯定是一个重绘问题。这就好像控件本身中有一个bug。我使用的是一个MVVM解耦模型,但我非常接近于直接在
DataGrid
上对本页后面的代码进行黑客攻击来调用Measure。我已经测试了后端,它工作正常;发送适当的集合和属性更改通知。这实在令人非常沮丧

编辑


我发现,如果我直接使用
ObservableCollection
,一切都会正常工作。我认为Silverlight
DataGrid
ObservableCollection
类型有一些硬编码的依赖性。有人对这个假设有什么见解吗?说不是吧

视图模型的示例可能会有所帮助。我猜
ReadyProjects
中的可观察集合实现了
INotifyPropertyChanged
IsBusy
ShowEmpty
。您的DataContext是否为
ReadyProjects
属性本身实现并触发了属性更改,以注册初始集?

好吧,我有时是个白痴。我的问题是:我重载了collectionchanged方法上的
ObservableCollection
,但从未实际调用它的基类版本


我希望这对其他人有所帮助。

收藏本身使用的INotifyCollectionChanged。我在构建视图模型时正在构建集合。我使用MEF将视图(页面)与其视图模型粘合在一起。当我更新集合时,我将尝试手动调用PropertyChanged事件。不,它也在做同样的事情。我发现使用ObservableCollection可以很好地工作。我开始认为DataGrid只在处理ObservableCollection时使用INotifyCollectionChanged。也就是说,它正在检查(typeof(itemSource)=typeof(observeablecollection))。这是非常糟糕的形式,完全没有必要,因为它可能只是检查(itemSource是ObservableCollection)或者更好(itemSource是INotifyCollectionChanged)。我找不到关于这种可能性的任何信息。
 <navigation:Page x:Class="MyNamespace.MachineView"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                 xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
                 xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit" 
                 xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" 
                 xmlns:common="-- proprietary reference --" 
                 xmlns:res="-- proprietary reference --"
                 xmlns:sclHelpers="-- proprietary reference --" 
                 mc:Ignorable="d"
                 d:DesignWidth="1024" d:DesignHeight="768"
                 res:Strings.Assignment="Title=MachineView.Title">
    <Border Margin="35,10,35,0" VerticalAlignment="Top">
        <ScrollViewer ScrollViewer.VerticalScrollBarVisibility="Auto">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition/>
                    <RowDefinition Height="25"/>
                    <RowDefinition/>
                    <RowDefinition Height="25"/>
                    <RowDefinition/>
                </Grid.RowDefinitions>
                <toolkit:HeaderedContentControl d:LayoutOverrides="Width, Height, GridBox" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" Margin="0">
                    <toolkit:HeaderedContentControl.Header>
                        <TextBlock res:Strings.Assignment="Text=MachineView.ReadyProjectsTitle" TextWrapping="Wrap" Style="{StaticResource HeaderTextStyle}"/>

                    </toolkit:HeaderedContentControl.Header>
                    <Grid>
                        <sdk:DataGrid Background="#7FFFFFFF" AutoGenerateColumns="False" ItemsSource="{Binding ReadyProjects}" d:LayoutOverrides="Width, Height" Margin="0" Grid.ColumnSpan="2" MinHeight="75">
                            <sdk:DataGrid.Columns>
                                <sdk:DataGridTextColumn res:Strings.Assignment="Header=MachineView.ProjectNumberLabel"
                                    Binding="{Binding ProjectNumberText, FallbackValue=[Project Number]}" 
                                    IsReadOnly="True"/>
                                <sdk:DataGridTextColumn res:Strings.Assignment="Header=MachineView.ProjectNameLabel"
                                    Binding="{Binding NameText, FallbackValue=[Project Name]}"
                                    IsReadOnly="True"/>
                                <sdk:DataGridTextColumn res:Strings.Assignment="Header=MachineView.ProjectStatusLabel"
                                    Binding="{Binding StatusText, FallbackValue=[Status]}"
                                    IsReadOnly="True"/>
                            </sdk:DataGrid.Columns>
                        </sdk:DataGrid>
                        <common:MiniBusyControl Height="20" HorizontalAlignment="Center" Grid.ColumnSpan="3" Margin="0,24,0,0" Visibility="{Binding ReadyProjects.IsBusy, Converter={StaticResource VisibilityConverter}}"/>
                        <TextBlock res:Strings.Assignment="Text=EmptyText" HorizontalAlignment="Center" TextWrapping="Wrap" Visibility="{Binding ReadyProjects.ShowEmpty, Converter={StaticResource VisibilityConverter}}" VerticalAlignment="Center" Margin="0,24,0,0" FontStyle="Italic"/>
                    </Grid>
                </toolkit:HeaderedContentControl>
            </Grid>
        </ScrollViewer>
    </Border>
</navigation:Page>