2

特定の基準に基づいてObservableCollectionの「ビュー」を作成することにより、データをピボットしようとしています。これが簡単な例です。

2つのListViewがあります。1つはのコレクションに直接バインドされ、もう1つはを使用して最初のコレクションから派生しDatesたコレクションにバインドされます。DatesAfterTodayWhere(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));
    }
}

更新:質問を編集して、少し読みやすくしました。

4

1 に答える 1

3

Modelコンストラクターを次のように変更します。

public Model()
{
    _Dates = new ObservableCollection<DateTime>();

    _Dates.CollectionChanged += (s, e) =>
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs("DatesAfterToday"));
            }
        };
}

コレクションにアイテムを追加/削除する_Datesと、セッターが呼び出されないため、プロパティ変更イベントDatesAfterTodayが発生しません。

コレクションの場合、WPF は、によって実装されたインターフェイスCollectionChangedによって公開されるイベントも登録します。したがって、コレクションが変更されるたびに通知を発生させることができます。INotifyCollectionChangedObservableCollectionDatesAfterToday_Dates

于 2012-11-22T13:22:41.133 に答える