我有一个带有ItemsSource属性的UserControl。由于基础UserControl类没有实现ItemsSource,因此我不得不创建自己的依赖属性,如下所示:
#region ItemsSource Dependency Property
public static readonly DependencyProperty ItemsSourceProperty =
DependencyProperty.Register("ItemsSource", typeof(IEnumerable), typeof(MonthViewControl),
new PropertyMetadata(OnItemsSourceChanged));
static void OnItemsSourceChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
(obj as MonthViewControl).OnItemsSourceChanged(e);
}
private void OnItemsSourceChanged(DependencyPropertyChangedEventArgs e)
{
RefreshLayout();
}
public IEnumerable ItemsSource
{
get
{
return (base.GetValue(ItemsSourceProperty) as IEnumerable);
}
set
{
base.SetValue(ItemsSourceProperty, value);
}
}
#endregion
现在在我的ViewModel中,我有一个Events属性,它是一个EventItem项目的ICollectionView集合,如下所示:
private ObservableCollection<Controls.EventCalendar.EventItem> eventItems;
private CollectionViewSource events;
public System.ComponentModel.ICollectionView Events
{
get
{
if (events == null)
{
events = new CollectionViewSource();
events.Source = eventItems;
}
return events.View;
}
}
我面临的问题是,在我的视图中,当我绑定到Events属性并向eventItems添加一个项目时,用户控件不会触发ItemsSourceChanged事件,因此不会更新UI。为了测试,我在视图中添加了一个简单的ListBox,它也绑定到Events属性。那很好用。对eventItems observableCollection的更新反映在ListBox中。
我想这与我的ItemsSource依赖属性有关。也许我需要使用从ItemsControl继承而来的自定义控件,而不是用户控件?
为了帮助您理解我的问题:我正在尝试创建一个类似于Google日历的控件,显示事件/议程条目。它很好用。当控件调整大小时,UI会更新。唯一剩下的就是在ItemsSource更改后的自动更新。
希望有人能帮忙。
编辑:我发布时意识到,由于ItemsSource属性未更改,因此无法触发事件。它是基础集合发生变化。但是,我不知道如何处理。我需要实现什么才能使其工作?只需要一个提示即可。我不需要每个实现细节。