C# 绑定到派生集合的ListView未更新(XAML/Windows 8)
我试图通过基于某些标准创建一个可观察集合的“视图”来调整数据。这里有一个简单的例子 我有两个列表视图。一个直接绑定到C# 绑定到派生集合的ListView未更新(XAML/Windows 8),c#,xaml,listview,windows-8,observablecollection,C#,Xaml,Listview,Windows 8,Observablecollection,我试图通过基于某些标准创建一个可观察集合的“视图”来调整数据。这里有一个简单的例子 我有两个列表视图。一个直接绑定到日期的集合,另一个绑定到DatesAfterToday集合,该集合使用从第一个集合派生,其中(x=>x.Date>DateTime.Today) 当我向我的Dates集合中添加一个新项目时,只有第一个ListView更改。绑定到DatesAfterToday的ListView根本不更新。我曾尝试向viewmodel添加一个PropertyChangedEventHandler,并在
日期的集合
,另一个绑定到DatesAfterToday
集合,该集合使用从第一个集合派生,其中(x=>x.Date>DateTime.Today)
当我向我的Dates
集合中添加一个新项目时,只有第一个ListView更改。绑定到DatesAfterToday的ListView根本不更新。我曾尝试向viewmodel添加一个PropertyChangedEventHandler
,并在更新日期集合时启动它,但它不起作用
MainPage.xaml
<StackPanel>
<ListView x:Name="ListOne" ItemsSource="{Binding Dates}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Date}"></TextBlock>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<ListView x:Name="ListTwo" ItemsSource="{Binding DatesAfterToday}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Date}"></TextBlock>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<Button Click="Button_Click_1">Press Me to Add a Date</Button>
</StackPanel>
更新:编辑问题,使其更易于阅读 修改您的
模型构造函数,如下所示:
public Model()
{
_Dates = new ObservableCollection<DateTime>();
_Dates.CollectionChanged += (s, e) =>
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs("DatesAfterToday"));
}
};
}
公共模型()
{
_日期=新的ObservableCollection();
_Dates.CollectionChanged+=(s,e)=>
{
var handler=PropertyChanged;
if(处理程序!=null)
{
处理人(此,新属性ChangedEventArgs(“DatesAfterToday”);
}
};
}
问题是,当您从\u Dates
集合中添加/删除项时,将不会调用setter,这就是为什么不会引发DatesAfterToday
的属性更改事件的原因
对于集合,WPF还注册了CollectionChanged
事件,该事件由INotifyCollectionChanged
接口公开,该接口由observedcollection
实现。因此,只要修改了\u Dates
集合,您就可以为DatesAfterToday
发出通知
public sealed partial class ListTest : Page
{
public Model model;
public ListTest()
{
this.InitializeComponent();
model = new Model();
model.Dates.Add(new DateTime(2012, 11, 12, 0, 0, 0));
model.Dates.Add(new DateTime(2012, 11, 15, 0, 0, 0));
model.Dates.Add(new DateTime(2012, 11, 17, 0, 0, 0));
model.Dates.Add(new DateTime(2012, 11, 20, 0, 0, 0));
model.Dates.Add(new DateTime(2012, 11, 22, 0, 0, 0));
this.DataContext = model;
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
model.Dates.Add(new DateTime(2012, 11, 24, 0, 0, 0));
}
}
public Model()
{
_Dates = new ObservableCollection<DateTime>();
_Dates.CollectionChanged += (s, e) =>
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs("DatesAfterToday"));
}
};
}