更新绑定到它的ObservableCollection后,DataGrid不会更新

时间:2012-09-18 10:23:57

标签: c# wpf xaml wpfdatagrid

我有一个非常严重的问题,有几天我无法解决。

我有一个带有数据网格的XAML窗口,ItemsSource绑定到自定义类型的静态属性,该自定义类型包含另一个自定义类型的ObservableCollection

XAML:

<Window x:Class="TheFaceBook.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:TheProject"
    Title="MainWindow" MinHeight="253" MinWidth="882" xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" mc:Ignorable="d" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" d:DesignHeight="632" d:DesignWidth="933" SizeToContent="WidthAndHeight">
<Window.Resources>
    <local:MainWindow x:Key="mainWindow"/>
</Window.Resources>
<Grid>
    <Button Content="Start" Height="33" Margin="0,28,12,0" VerticalAlignment="Top" Click="BtnStart_Click" HorizontalAlignment="Right" Width="97" />
    <DataGrid Margin="12,110,12,42" AutoGenerateColumns="False" ItemsSource="{Binding CurrentUser.TaggedImages}"  >
        <DataGrid.Columns>
            <DataGridTemplateColumn Width="50" IsReadOnly="True">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Image Source="{Binding AbsoluteURL}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTextColumn Binding="{Binding FacebookURL}"/>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

属性背后的代码:

private static User m_CurrentUser;
public static User CurrentUser
{
    get { return MainWindow.m_CurrentUser; }
    set
    {
        MainWindow.m_CurrentUser = value;
    }
}

用户类:

private ObservableCollection <Picture> m_TaggedImages;

#endregion
#region Properties

public ObservableCollection<Picture> TaggedImages
{
    get { return m_TaggedImages; }
    set 
    { 
        m_TaggedImages = value;
    }
}

图片类:

public class Picture : INotifyPropertyChanged
{

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion
    private string m_URL;
    private string m_AbsoluteURL;
    private List<User> m_TaggedUsers;

    public List<User> TaggedUsers
    {
        get { return m_TaggedUsers; }
        set 
        {
            m_TaggedUsers = value;
            OnPropertyChanged("TaggedUsers");
        }
    }

    public string AbsoluteURL
    {
        get { return m_AbsoluteURL; }
        set
        {
            m_AbsoluteURL = value;
            OnPropertyChanged("AbsoluteURL");
        }
    }

    public string URL
    {
        get { return m_URL; }
        set
        {
            m_URL = value;
            OnPropertyChanged("URL");
        }
    }
}

将图片添加到TaggedImagse的代码:

在bgwDoWork中:

bgwPictureFinder.ReportProgress(0,pic);

bgwProgressChanged:

static void bgwPictureFinder_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    if (e.ProgressPercentage == 0)
    {
        Picture pic = (Picture)e.UserState;
        MainWindow.CurrentUser.TaggedImages.Add(pic);
    }
}

当我从其他MainWindow.CurrentUser.TaggedImages手动添加到backgroundworker时效果很好,但是从bgwPictureFinder_ProgressChanged添加时,它会将图片添加到MainWindow.CurrentUser.TaggedImages observableCollection但不会更新用于显示图像的UI。

我无法弄清楚造成这个问题的原因。

3 个答案:

答案 0 :(得分:0)

我不确定WPF upto(v 4.0)是否支持数据绑定到静态属性。 .NET 4.5中添加了此功能。 Check this.

WPF版本4.5新功能的引言:

  

绑定到静态属性

     

您可以使用静态属性作为数据绑定的来源。该   如果a,则数据绑定引擎会识别属性值的变化   引发静态事件。例如,如果SomeClass类定义了一个   名为MyProperty的静态属性,SomeClass可以定义一个静态事件   当MyProperty的值发生变化时引发。静态事件   可以使用以下任一签名。

public static event EventHandler MyPropertyChanged;
public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;
  

请注意,在第一种情况下,该类公开名为的静态事件   将EventArgs传递给事件处理程序的PropertyNameChanged。在里面   第二种情况,该类公开了一个名为的静态事件   将PropertyChangedEventArgs传递给的StaticPropertyChanged   事件处理程序实现静态属性的类可以选择   使用任一方法提出财产变更通知。

答案 1 :(得分:0)

我怀疑它必须对初始化新对象的顺序做些什么。例如TaggedImages List和实际的CurrentUser属性。检查真的很简单。查看“调试绑定”,看看会发生什么。

我也会添加OnPropertyChanged(“TaggedImages”)。是的,observableCollection的添加/删除已经实现,但我不认为WPF能够在没有OnPropertyChanged的情况下判断实际的集合引用何时更改。

答案 2 :(得分:0)

我想你错过了代码例子:

protected void OnPropertyChanged(string propertyName)
{
   var handlers = PropertyChanged;
   if (handlers != null)
   {
      handlers(this, new PropertyChangedEventArgs(propertyName));
   }
}

对于你的Binding,我使用双向模式:

{Binding..., Mode=TwoWay}