Привязка прикрепленного свойства к IEnumerable - PullRequest
1 голос
/ 11 мая 2011

Я использую новый WPF Viewer для Crystal Reports в C #.Поскольку я использую MVVM, я действительно хотел бы связать источник отображаемых данных вместо того, чтобы делать это в загруженном событии.Поэтому я хотел реализовать прикрепленное свойство для источника - но привязка просто не работает, метод Getter даже не вызывается.Другие посты о привязке прикрепленных свойств также не помогли, и я не уверен, что я делаю по-другому.Кто-нибудь может помочь?Вот мой упрощенный код для присоединенного свойства:

public static class CrystalReportsAttached {
    public static readonly DependencyProperty SourceProperty =
        DependencyProperty.RegisterAttached(
            "Source",
            typeof(IEnumerable),
            typeof(CrystalReportsAttached),
            new UIPropertyMetadata(new ObservableList<Participant>() as IEnumerable, SourceChanged));

    public static void SetSource(DependencyObject target, IEnumerable value) {
        target.SetValue(SourceProperty, value);
    }

    public static IEnumerable GetSource(DependencyObject target) {
        return (IEnumerable)target.GetValue(SourceProperty);
    }

    private static void SourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
        CrystalReportsViewer reportViewer = d as CrystalReportsViewer;
        if (reportViewer != null) {
            MyCrystalReport report = new MyCrystalReport();
            report.SetDataSource(d.GetValue(SourceProperty) as IEnumerable);
            reportViewer.ViewerCore.ReportSource = report;
        }
    }
}

, где MyCrystalReport - это оболочка для моего файла отчета rpt.

Если я сейчас привяжусь к источнику, как это, это не такработает:

<my:CrystalReportsViewer prop:CrystalReportsAttached.Source="{Binding MyList, Mode=OneWay}"/>

Я пытался связать DataGrid s ItemsSource таким же образом, и это работает, поэтому, похоже, нет ошибки с именем пути или чем-то подобным.

Любая помощь с благодарностью.Большое спасибо!

Ответы [ 3 ]

2 голосов
/ 11 мая 2011

Со свойствами зависимостей все, в чем вы когда-либо можете быть уверены, это то, что обратный вызов измененного свойства будет вызываться при изменении свойства, и что базовое свойство будет фактически изменено , если вызван ваш метод получения. Это может показаться странным, но ваш метод получения и установки просто получает доступ к этому базовому свойству, поэтому, если синтаксический анализатор XAML вызывает target.GetValue(SourceProperty), он получает правильную вещь, не вызывая ваш метод получения.

Реальный вопрос в том, будет ли вызываться обратный вызов в вашей собственности?

1 голос
/ 11 мая 2011

Чтобы получать изменения в коллекции, исходная коллекция должна реализовывать INotifyCollectionChanged.

Вы можете использовать ObservableCollection, найти пользовательскую коллекцию уведомлений в Интернете или обернуть существующую коллекцию написанным вами классом, реализующим интерфейс.внутренней коллекции и INotifyCollectionChanged.

Если первоначальная привязка не удалась, проверьте, что вы установили DataContext (для вашей View-Model), что имя свойства на виртуальной машине является правильным и что свойство имеет общедоступныйgetter.

Редактировать:

Эта часть неверна:

new UIPropertyMetadata(new ObservableList<Participant>() as IEnumerable, SourceChanged));

Вы устанавливаете тот же экземпляр списка в качестве значения по умолчанию для всех элементов управления.Вместо этого установите значение по умолчанию в конструкторе (укажите ноль в строке рег. DP).

0 голосов
/ 11 мая 2011

Я наконец понял, где проблема:

Похоже, DataContext CrystalReportViewer по какой-то причине переопределен. Следовательно, привязка работает в любом другом контексте (например, в DataGrid), но не здесь. Я обнаружил проблему с помощью инструмента snoop , упомянутого в default.kramer выше. Я мог бы исправить это, изменив привязку на

* * 1010

, таким образом, он получает доступ к DataContext из UserControl (который обычно должен быть таким же, как для конкретного элемента управления, но не для CrystalReportsViewer), и он работает сейчас.

Спасибо всем за помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...