몇 가지 기본 차트/그래프 기능이있는 사용자 정의 컨트롤을 만드는 중입니다. 본질적으로 컨트롤의 사용자가 바인딩 할 수있는 "Items"종속성 속성을 갖고 싶습니다. 그러면 컨트롤에서 소스에 대한 모든 항목과 업데이트를 표시합니다.사용자 만들기 차트 작성을위한 항목 만들기
내가 지금까지 한 것은 사용자 컨트롤에 코드 "DP"를 만드는 것입니다.
public static readonly DependencyProperty ItemsProperty =
DependencyProperty.Register("Items",
typeof(ObservableCollection<Polyline>),
typeof(RPGraph),
new FrameworkPropertyMetadata(
new ObservableCollection<Polyline>(),
new PropertyChangedCallback(OnItemsChanged)));
public ObservableCollection<Polyline> Items
{
get { return (ObservableCollection<Polyline>)GetValue(ItemsProperty); }
set { SetValue(ItemsProperty, value); }
}
public static void OnItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
}
내 첫 번째 걸림돌은 컬렉션이 변경되었을 때 "OnItemsChanged"가 호출되지 않는다는 것입니다. 두 시간 후 왜 stackoverflow 게시물 (ObservableCollection dependency property does not update when item in collection is deleted) 설명을 발견했다. 이 조언을 따라하면 내 문제의 한 부분이 해결되었습니다. 이제 ObservableCollection 목록에 새 항목 (폴리 라인)을 추가 할 수있었습니다. 그러나 폴리 라인에 추가 점을 추가하거나 점을 수정하면 어떻게됩니까? 이전 문제에 대한 지식으로 무장 한 Points.Changed 이벤트를 발견했습니다. 그 다음에 구독하고 거기에 업데이트 코드를 넣었습니다.
이 작업은 마침내 가능하지만 더 나은 또는 더 우아한 방법으로이 작업을 수행해야합니다 (상단에 명시된 바와 같이). ObservableCollection을 사용하지 않는 것으로 생각합니다. 어떤 충고? 다음은
이 작업 OnItemChanged 방법 (초안 코드를 변명이다, 난 그냥 :-) 작업을 얻을 싶었 :ObservableCollection
이 알리지 않습니다
public static void OnItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var thisControl = d as RPGraph;
foreach (Polyline poly in thisControl.Items)
thisControl.manager.Items.Add(poly.Points.ToArray());
if (e.OldValue != null)
{
var coll = (INotifyCollectionChanged)e.OldValue;
// Unsubscribe from CollectionChanged on the old collection
coll.CollectionChanged -= Items_CollectionChanged;
}
if (e.NewValue != null)
{
var coll = (ObservableCollection<Polyline>)e.NewValue;
// Subscribe to CollectionChanged on the new collection
coll.CollectionChanged += (o, t) => {
ObservableCollection<Polyline> items = o as ObservableCollection<Polyline>;
thisControl.manager.Items.Add(items[t.NewStartingIndex].Points.ToArray());
foreach (Polyline poly in items)
{
poly.Points.Changed += (n, m) => {
for (int i = 0; i < thisControl.manager.Items.Count; i++)
thisControl.manager.Items[i] = thisControl.Items[i].Points.ToArray();
thisControl.manager.DrawGraph(thisControl.graphView);
};
}
thisControl.manager.DrawGraph(thisControl.graphView);
};
}
thisControl.manager.DrawGraph(thisControl.graphView);
}
AFAIK이 작업을 수행하는 다른 방법은 없습니다. 모니터하려는 계층 구조의 각 레벨에서 이벤트 핸들러를 사용해야합니다. 예를 들어, 목록을 모니터링하여 삽입 및 삭제를 감지 한 다음 목록의 각 요소를 모니터링하여 속성이 변경된시기 등을 감지합니다.주의했듯이이 코드는 복잡하고 장황한 코드로 이어집니다. –