У меня есть страница в моем приложении Navigatable Silverlight, похожая на следующую (проприетарные ссылки удалены):
<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>
DataGrid
не перерисовывается, когда коллекция, связанная со свойством ItemSource
изначально заселен.Коллекция - это тип, который наследуется непосредственно от ObservableCollection<T>
, чтобы обернуть другие свойства в коллекцию (например, IsBusy
и ShowEmpty
).Всякий раз, когда я прибегаю или изменяю размер столбца пользовательского интерфейса DataGrid
, появляются данные, поэтому, скорее всего, это проблема перерисовки.Как будто в самом элементе управления есть ошибка.Я использую модель MVVM с разделением, но я очень близок к тому, чтобы просто взломать код этой страницы, чтобы напрямую вызывать Measure для DataGrid
.Я протестировал бэкэнд, и он работает правильно;отправка соответствующих уведомлений о коллекции и изменении имущества.Это действительно очень расстраивает.
Редактирование
Я обнаружил, что если я вместо этого использую ObservableCollection<T>
напрямую, все это работает.Я думаю, что Silverlight DataGrid
имеет некоторую жестко-зависимую зависимость от типа ObservableCollection<T>
.Есть ли у кого-нибудь понимание этой гипотезы?Скажи это не так!