2

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

我有一个带有数据网格的 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 以显示图像。

我只是无法弄清楚是什么导致了这个问题。

4

3 回答 3

0

我不确定 WPF upto (v 4.0) 是否支持数据绑定到静态属性。此功能是在 .NET 4.5 中添加的。检查这个。

引用 WPF 4.5 版中的新增功能:

绑定到静态属性

您可以使用静态属性作为数据绑定的来源。如果引发静态事件,数据绑定引擎会识别属性值何时更改。例如,如果类 SomeClass 定义了一个名为 MyProperty 的静态属性,那么 SomeClass 可以定义一个静态事件,该事件在 MyProperty 的值更改时引发。静态事件可以使用以下任一签名。

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

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

于 2012-09-18T10:31:46.607 回答
0

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

我也会添加 OnPropertyChanged("TaggedImages") 。是的,observableCollection 的添加/删除已经实现,但我认为 WPF 无法在没有 OnPropertyChanged 的​​情况下判断实际集合引用何时发生变化。

于 2012-09-18T15:03:20.237 回答
0

我认为您在代码示例中错过了这一点:

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

对于您的绑定,我使用双向模式:

{Binding..., Mode=TwoWay}
于 2012-09-18T15:23:42.110 回答