Имам следната настройка:
- Персонализирана WPF контрола (базов клас), произлизаща от
Canvas
- Реализация на този базов клас
ObservableCollection<T>
свойство на зависимост от тази реализация
Имам тестово приложение, което показва три уникални екземпляра на моята персонализирана контрола (напр. <custom:MyControl x:Name="Test1" />
, Test2, Test3 и т.н.). Когато стартирам и отстранявам грешки в приложението, съдържанието на ObservableCollection<T>
е едно и също за трите екземпляра на контролата. Защо е това?
Диаграма:
[ContentProperty("DataGroups")]
public abstract class Chart : Canvas
{
static Chart()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(Chart), new FrameworkPropertyMetadata(typeof(Chart)));
}
public ObservableCollection<ChartData> DataGroups
{
get { return (ObservableCollection<ChartData>)GetValue(DataGroupsProperty); }
set { SetValue(DataGroupsProperty, value); }
}
public static readonly DependencyProperty DataGroupsProperty =
DependencyProperty.Register("DataGroups", typeof(ObservableCollection<ChartData>), typeof(Chart), new FrameworkPropertyMetadata(new ObservableCollection<ChartData>(), FrameworkPropertyMetadataOptions.AffectsArrange));
public abstract void Refresh();
}
ChartData:
[ContentProperty("Points")]
public class ChartData : FrameworkElement
{
public ObservableCollection<Point> Points
{
get { return (ObservableCollection<Point>)GetValue(PointsProperty); }
set { SetValue(PointsProperty, value); }
}
public static readonly DependencyProperty PointsProperty =
DependencyProperty.Register("Points", typeof(ObservableCollection<Point>), typeof(ChartData), new PropertyMetadata(new ObservableCollection<Point>()));
}
Един от начините, по които променям данните от диаграмата, е (приемайки множество групи данни), например:
MyChart.DataGroups[index].Points.Add(new Point() { Y = someNumber });
MyChart.Refresh();
Но всеки екземпляр в DataGroups[]
е идентичен.
Същото нещо се случва, ако дефинирам своята колекция(и) чрез XAML, така:
<c:Chart x:Name="ChartA">
<c:ChartData x:Name="DataGroup1" />
<c:ChartData x:Name="DataGroup2" />
</c:Chart>
След това в код ще имам достъп до дефинираните колекции:
ChartA.DataGroups[0].Points.Add(new Point() { Y = someNumber });
ChartA.Refresh();
Points
? Как се присвоява? - person Gabe   schedule 07.10.2013[ContentProperty]
). ИPoint
е простоSystem.Windows.Point
. - person qJake   schedule 07.10.2013Test1.Points = new ObservableCollection<Point>(); Test2.Points = new ObservableCollection<Point>(); Test1.Points.Add(new Point());
, тогаваTest2.Points
ще има същата точка като добавената къмTest1
? - person Gabe   schedule 07.10.2013Points
по този начин, защото вFrameworkPropertyMetadata
указвате стойност по подразбиране, която аз така или иначе зададох наnew ObservableCollection<Point>()
. Освен това точките не са единствените неща, които се дублират, има и други (непоказани) свойства вChartData
, които също се дублират. По същество това еpublic ObservableCollection<ChartData> DataGroups
, което действа статично, въпреки че не е така. - person qJake   schedule 07.10.2013