Silverlight DataGrid的按列排序不会更新以编程方式更改的单元格

时间:2010-04-13 22:10:29

标签: c# silverlight datagrid

对于我的第一个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(),这会更新Image元素的Source属性,其中BitmapImage来自Flickr照片的URI,并将图片的可见性设置为{{1} }。点击这样显示的图像再次隐藏它。所有这些都很容易实现并且运行良好。

但每当我点击其中一个列标题按该列排序时,我以这种方式更新的单元格不会更改。 Visible的其余部分被适当地使用和更新,但这些单元格仍然落后于其他行。这很奇怪,根本不是我想要的。

我做错了什么?我是否应该以某种方式使DataGrid更新以响应排序事件,如果是这样的话?或者,如果我不应该直接搞乱网格的内容,那么获得我想要的行为的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

我认为你应该将Image Source绑定到集合中的元素,并在后面的代码中更新该元素,而不是直接修改元素。确保您的属性生成属性更改事件,并且您的主对象实现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....
}

答案 1 :(得分:0)

排序后你是否尝试过DataGrid.items.refresh? 可能太容易回答,但它有时解决了我对Datagrid的问题......