ObservableCollection как зависимость DeperProperty и проблемы связывания - PullRequest
0 голосов
/ 20 октября 2011

Я создал элемент управления Chart и через некоторое время решил добавить в него возможности мультисерии. Я реализовал функцию, используя свойство зависимости типа ObservableCollection<ChartSerie>, например:

private static DependencyPropertyKey SeriesPropertyKey = DependencyProperty.RegisterReadOnly("Series", typeof(ObservableCollection<ChartSerie>), typeof(Chart), new FrameworkPropertyMetadata(new ObservableCollection<ChartSerie>()));
public static DependencyProperty SeriesProperty = SeriesPropertyKey.DependencyProperty;

Я использую это свойство из XAML, называя его следующим образом:

    <chart:Chart>
        <chart:Chart.Series>
            <chart:ChartSerie Data="{Binding ChartData1}"/>
            <chart:ChartSerie Data="{Binding ChartData2}" />
        </chart:Chart.Series>
    </chart:Chart>

Код ChartSerie - это просто контейнер ChartData:

public static DependencyProperty DataProperty = DependencyProperty.Register("Data", typeof(ObservableCollection<ChartPoint>), typeof(ChartSerie), new FrameworkPropertyMetadata(OnDataChanged));

Проблема, с которой я сталкиваюсь, заключается в том, что экземпляры ChartSerie не заполняются данными, связанными с привязкой. Их свойство Data всегда имеет значение null. У меня нет ошибок привязки на выходе визуальной студии.

Заранее спасибо.

РЕДАКТИРОВАТЬ: После копания немного похоже, что здесь есть реальная проблема связывания. Похоже, DataContext из Chart не наследуется ChartSerie. ChartSerie является FrameworkElement на всякий случай, если это имеет значение

1 Ответ

1 голос
/ 20 октября 2011

Насколько я помню, вам нужно определить свою собственную неуниверсальную коллекцию вместо того, чтобы выставлять универсальный ObservableCollection<Whatever>:

public class ChartSeriesCollection : ObservableCollection<ChartSeries>
{
}

...

public static readonly DependencyProperty ChartSeriesProperty = DependencyProperty.Register(
    "ChartSeries",
    typeof(ChartSeriesCollection),
    typeof(MyClass));

Если вы этого не сделаете, все станет очень странно.

...