我有一个非常严重的问题,有几天我无法解决。
我有一个带有数据网格的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。
我无法弄清楚造成这个问题的原因。
答案 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}