Benutzer-Steuerelement mit benutzerdefinierten ItemsSource Abhängigkeitseigenschaft
Ich habe ein UserControl mit einer ItemsSource-Eigenschaft. Als Basis-UserControl-Klasse nicht implementiert ItemsSource, ich hatte, um meine eigene Abhängigkeit Eigenschaft wie folgt:
#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
Nun in meinem ViewModel-ich habe eine Events-Eigenschaft, die eine ICollectionView von EventItem Elemente, etwa so:
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;
}
}
Das Problem, das ich bin vor ist, dass in meinem Blick, wenn ich binden an die Events-Eigenschaft, und ich fügen Sie ein Element, um eventItems, das UserControl wird nicht ausgelöst, die ItemsSourceChanged Veranstaltung und damit auch nicht die Aktualisierung der Benutzeroberfläche.
Zum Wohle der Tests, die ich Hinzugefügt ein einfaches Listenfeld zur Ansicht, die auch bindet an die Events-Eigenschaft. Das funktioniert wie ein Charme. Updates für eventItems observableCollection spiegeln sich in der ListBox.
Ich bin herauszufinden es hat etwas zu tun mit meiner ItemsSource-Abhängigkeitseigenschaft. Vielleicht würde ich brauchen, um ein Benutzerdefiniertes Steuerelement verwenden, die erbt form ItemsControl statt ein UserControl?
Zu helfen, Sie verstehen mein problem: ich versuche einen Kalender erstellen, wie die Kontrolle, die zeigt events/agenda-Einträgen (ähnlich zu Google-Kalender). Es funktioniert wie ein Charme. Die Benutzeroberfläche wird aktualisiert, wenn die Steuerung angepasst wird. Das einzige, was übrig bleibt, ist das automatische update einmal die ItemsSource-änderungen.
Hoffe mir kann jemand helfen.
EDIT: Der moment, in dem ich geschrieben habe ich realisiert, dass das Ereignis kann nicht ausgelöst werden, da die ItemsSource-Eigenschaft nicht ändern. Es ist die zugrunde liegende Sammlung, die änderungen. Allerdings bin ich mir nicht, wie damit umzugehen ist. Was brauche ich, um zu implementieren, um diese Arbeit zu machen. Nur ein kleiner Tip würde reichen. Ich brauche nicht alle Einzelheiten der implementation.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eröffnung der PresentationFramework.dll innerhalb Reflektor und suchen im System.Windows.Controls.ItemsControl ergab die folgenden:
Nicht zu wissen, was
RefreshLayout
tut meine Vermutung ist, dass es hat etwas zu tun mit der Art und Weise derObservableCollection<T>
wird gewickelt wie der obige code ist blind gegenüber dem, was die konkrete collection-Typ ist und es wäre daher behandelt werden, indem der Typ wird gewickelt; in diesem Fall ist eineObservableCollection<T>
Versuchen, ändern Sie Ihre Eigenschaft, wie unten zu sehen die Rückkehr der Standard-Ansicht und passen Sie IhreItemsSource
Eigenschaft eher zu den obigen code aus dem Rahmen, und arbeiten Sie sich rückwärts von dort.