DataGrid не перерисовывается при изменении свойства ItemsSource - PullRequest
0 голосов
/ 26 марта 2012

У меня есть страница в моем приложении 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>.Есть ли у кого-нибудь понимание этой гипотезы?Скажи это не так!

Ответы [ 2 ]

0 голосов
/ 26 марта 2012

Хорошо, я иногда идиот. Моя проблема была в следующем: я перегрузил ObservableCollection<T> метод OnCollectionChanged, но никогда не вызывал его версию базового класса.

Вздох.

Надеюсь, это поможет кому-то еще.

0 голосов
/ 26 марта 2012

Пример вашей модели представления может помочь.Я предполагаю, что наблюдаемая коллекция в ReadyProjects реализует INotifyPropertyChanged для IsBusy и ShowEmpty.Изменяет ли ваш объект DataContext и свойство fire для самого свойства ReadyProjects, чтобы зарегистрировать исходный набор?

...