2010-04-13 21 views
4

对于我的第一个Silverlight应用程序,我编写了一个程序,将用户提供的搜索字符串发送到Flickr REST API并在DataGrid中显示结果。所述网格如此定义:Silverlight 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属性更新为从Flickr照片的URI导出的BitmapImage,并将图像的可见性设置为Visible。点击显示的图像再次隐藏。所有这些都很容易实现,并且完美地工作。

但是,无论何时点击其中一个列标题以按该列进行排序,我以这种方式更新的单元格都不会更改。 DataGrid的其余部分被适当地更新和更新,但这些单元格保持在后面,与其他行中的单元格分离。这很奇怪,根本不是我想要的。

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

+1

你可以发布ShowPhoto()和HidePhoto()方法吗? – rwilliams 2010-04-21 21:34:41

回答

1

我认为你应该将图像源绑定到集合中的元素,并在代码后面更新该元素,而不是直接修改元素。确保您的财产产生一个属性更改事件,你的主要目标实现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)); 
      } 
     } 

*********************添加代码,以澄清** ********************* 您应该在隐藏图像时重置行高。 我在背景中看不到涂抹和图像的任何问题。这里是我的代码背后

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

我尝试了这个,但仍然有很多奇怪的行为:当我将图像隐藏在它们中时,网格单元拒绝调整自己的大小,并且滚动有时会导致图像的涂抹,扭曲版本仍然显示在背景中。 – 2010-04-26 13:41:18

+0

你可以发布显示/隐藏图片的代码吗? – Vitalik 2010-04-27 01:03:38

0

<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> 

码你尝试DataGrid.items.refresh排序后? 可能太容易得到答案,但它有时解决我与Datagrid的问题...

相关问题