У меня настроено следующее:
- Пользовательский элемент управления 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();
}
Данные диаграммы:
[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