Сортировка Silverlight DataGrid по столбцу не обновляет программно измененные ячейки - PullRequest
4 голосов
/ 14 апреля 2010

Для моего первого приложения Silverlight я написал программу, которая отправляет предоставленные пользователем строки поиска в Flickr REST API и отображает результаты в DataGrid. Указанная сетка определяется следующим образом:

<data:DataGrid x:Name="PhotoGrid" AutoGenerateColumns="False">
    <data:DataGrid.Columns>
        <data:DataGridTextColumn Header="Photo Title" Binding="{Binding Title}" CanUserSort="True" CanUserReorder="True" CanUserResize="True" IsReadOnly="True" />
        <data:DataGridTemplateColumn Header="Photo" SortMemberPath="ImageUrl">
            <data:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
                        <TextBlock Text="Click here to show image" MouseLeftButtonUp="ShowPhoto"/>
                        <Image Visibility="Collapsed" MouseLeftButtonUp="HidePhoto"/>
                    </StackPanel>
                </DataTemplate>
            </data:DataGridTemplateColumn.CellTemplate>
        </data:DataGridTemplateColumn>
    </data:DataGrid.Columns>
</data:DataGrid>

Это простая таблица из двух столбцов. Первый столбец содержит заголовок фотографии, а второй содержит текст «Нажмите здесь, чтобы показать изображение». Клики там вызывают ShowPhoto(), который обновляет свойство Source элемента Image с BitmapImage, полученным из URI фотографии Flickr, и устанавливает видимость изображения на Visible. Нажатие на изображение, таким образом раскрытое, скрывает его снова. Все это было легко реализовать и отлично работает.

Но всякий раз, когда я щелкаю один из заголовков столбцов для сортировки по этому столбцу, ячейки, которые я обновил таким образом, не меняются. Остальная часть DataGrid восстанавливается и обновляется соответствующим образом, но эти ячейки остаются позади, отделенными от остальной части их ряда. Это очень странно и совсем не то, что я хочу.

Что я делаю не так? Должен ли я как-то освежить DataGrid в ответ на событие сортировки, и если да, то как? Или, если я не собираюсь напрямую связываться с содержимым таблицы, как правильно получить желаемое поведение?

Ответы [ 2 ]

1 голос
/ 22 апреля 2010

Я думаю, вам следует привязать источник изображения к элементу в коллекции и обновить этот элемент в коде, а не изменять его напрямую. Убедитесь, что ваше свойство генерирует событие измененного свойства, а ваш главный объект реализует INotifyPropertyChanged

    public string Url
    {
        get { return url; }
        set
        {
            url = value;
            NotifyPropertyChanged("Url");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }

********************* Добавление кода для уточнения ********************* ** Вам, вероятно, следует сбросить высоту строки, когда вы прячете изображение. Я не вижу проблем с размытием и изображениями на заднем плане. Вот мой код

<DataTemplate>
    <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
        <Button Click="ShowHidePhoto" Content="show/hide" Tag="{Binding}"/>
        <Image Visibility="{Binding Visible}" Source="{Binding Url}" MouseLeftButtonUp="OnImageClick"/>
    </StackPanel>
</DataTemplate>

код позади

private void ShowHidePhoto(object sender, RoutedEventArgs e)
{
    DataHolder dh = (DataHolder)((Button)sender).Tag;
    dh.Visible = dh.Visible == Visibility.Collapsed ? Visibility.Visible : Visibility.Collapsed;
    // reset height here....
}
0 голосов
/ 28 апреля 2010

Пробовали ли вы DataGrid.items.refresh после сортировки? Возможно, ответ будет слишком лёгким, но это когда-нибудь решит проблемы, с которыми я столкнулся при использовании Datagrid ...

...