Mvvm 当ItemsSource属性更改时,DataGrid未重新绘制
我的可导航Silverlight应用程序中有一个类似于以下内容的页面(已删除专有引用):Mvvm 当ItemsSource属性更改时,DataGrid未重新绘制,mvvm,silverlight-4.0,datagrid,Mvvm,Silverlight 4.0,Datagrid,我的可导航Silverlight应用程序中有一个类似于以下内容的页面(已删除专有引用): 最初填充绑定到ItemSource属性的集合时,不会重新绘制DataGrid。集合是一种直接从observateCollection继承的类型,以便用集合包装其他属性(即IsBusy和ShowEmpty)。每当我使用或调整DataGridUI的列大小时,数据就会显示出来,因此这肯定是一个重绘问题。这就好像控件本身中有一个bug。我使用的是一个MVVM解耦模型,但我非常接近于直接在DataGrid上对本页
最初填充绑定到ItemSource
属性的集合时,不会重新绘制DataGrid
。集合是一种直接从observateCollection
继承的类型,以便用集合包装其他属性(即IsBusy
和ShowEmpty
)。每当我使用或调整DataGrid
UI的列大小时,数据就会显示出来,因此这肯定是一个重绘问题。这就好像控件本身中有一个bug。我使用的是一个MVVM解耦模型,但我非常接近于直接在DataGrid
上对本页后面的代码进行黑客攻击来调用Measure。我已经测试了后端,它工作正常;发送适当的集合和属性更改通知。这实在令人非常沮丧
编辑
我发现,如果我直接使用
ObservableCollection
,一切都会正常工作。我认为SilverlightDataGrid
对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>