特定の基準に基づいてObservableCollectionの「ビュー」を作成することにより、データをピボットしようとしています。これが簡単な例です。
2つのListViewがあります。1つはのコレクションに直接バインドされ、もう1つはを使用して最初のコレクションから派生しDates
たコレクションにバインドされます。DatesAfterToday
Where(x => x.Date > DateTime.Today)
コレクションに新しいアイテムを追加するとDates
、最初のListViewのみが変更されます。にバインドされたListViewDatesAfterToday
はまったく更新されません。ビューモデルにを追加し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 class Model : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public Model()
{
_Dates = new ObservableCollection<DateTime>();
}
private ObservableCollection<DateTime> _Dates;
public ObservableCollection<DateTime> Dates
{
get
{
return _Dates;
}
set
{
_Dates = value;
if (PropertyChanged != null){
PropertyChanged(this, new PropertyChangedEventArgs("_Dates"));
PropertyChanged(this, new PropertyChangedEventArgs("Dates"));
PropertyChanged(this, new PropertyChangedEventArgs("DatesAfterToday"));
}
}
}
public ObservableCollection<DateTime> DatesAfterToday
{
get {
return new ObservableCollection<DateTime>(
_Dates.Where(t => t.Date > DateTime.Today).ToList()
);
}
}
}
MainPage.xaml.cs
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));
}
}
更新:質問を編集して、少し読みやすくしました。