为什么ItemsControl不刷新

时间:2015-04-24 13:21:26

标签: c# wpf xaml propertychanged

我有以下xaml:

<Window.DataContext>
    <local:CalendarViewModel />
</Window.DataContext>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition
            Width="55*" />
        <ColumnDefinition
            Width="27*" />
    </Grid.ColumnDefinitions>
    <local:UserControlCalendar
        x:Name="ControlCalendar"
        Grid.Column="0">
    </local:UserControlCalendar>
    <ItemsControl
        x:Name="HistoryControl"
        Grid.Column="1"
        Width="210"
        Margin="30,10,0,0"
        HorizontalAlignment="Left"
        VerticalAlignment="Top"
        ItemTemplate="{StaticResource DataTemplate.HistoryItems}"
        ItemsPanel="{StaticResource ItemsPanel.Vertical}"
        ItemsSource="{Binding ListHistoryItems, Mode=OneWay}">
        <ItemsControl.ItemContainerStyle>
            <Style>
                <Setter Property="FrameworkElement.Margin" Value="0,10,0,0" />
            </Style>
        </ItemsControl.ItemContainerStyle>
    </ItemsControl>
</Grid>

在UserControlCalendar中选择日期时,应更改&#34; HistoryControl&#34;的内容。在ViewModel属性ListHistoryItems已更改,但UserControl中的ItemsControl不会刷新。 这是ViewModel:

using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
namespace CustomCalendar
{
  public class CalendarViewModel :  INotifyPropertyChanged
  {
    private ObservableCollection<HistoryItems> _listHistoryItems;
    private DateTime _selectedDate;

    public CalendarViewModel()
    {
    }

    public DateTime SelectedDate
    {
        get { return _selectedDate; }
        set
        {
            _selectedDate = value;
            if (_selectedDate != null)
            {
                ListHistoryItems = new ObservableCollection<HistoryItems>(GetHistoryItems(_selectedDate));
            }
        }
    }

    public ObservableCollection<HistoryItems> ListHistoryItems
    {
        get { return _listHistoryItems; }
        set
        {
            _listHistoryItems = value;
            RaisePropertyChanged("ListHistoryItems");
        }
    }

    protected virtual void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
  }
}

问题是Event PropertyChanged始终为null。 为什么? 在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

如果Collection发生变化,ObservableCollection会自动通知用户界面。如果HistoryModel属性发生更改,则需要将该属性的RaisePropertyChanged调用为notfyi UI。如果您通过new关键字创建新的ObservableCollection,则需要将其刷新为control.ItemsSource。

那些应该显示historymodel值的控件,使用binding path = propertyname

答案 1 :(得分:0)

我发现了自己的错误。为了在MainWindow中传输UserControlCalendar的SelectedDate,我在UserControlCalendar中创建了新的ViewModel。因此,没有任何效果。现在我删除了那个对象,一切正常。现在还有另一个问题,如何在ViewModel中传输SelectedDate。我认为使用Prism和EventAggregator。