对于我的第一个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
更新以响应排序事件,如果是这样的话?或者,如果我不应该直接搞乱网格的内容,那么获得我想要的行为的正确方法是什么?
答案 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的问题......