WPF - DataTemplate - Использование привязки элемента в присоединенном свойстве - PullRequest
1 голос
/ 20 сентября 2010

Я работаю над приложением, которое использует богато отформатированный ListBox.Одна из вещей, которые мне нужны, - привязать несколько фрагментов информации к кнопке, которая находится в DataTemplate ListBox.

Это чрезмерное упрощение моего реального кода, который я сделал, чтобы помочь вам понять проблему.

Вот фрагмент XAML внутри DataTemplate, который работает:

<Button Command="local:MediaCommands.StreamVideo"
    CommandParameter="{Binding Path=Folder}" />

Когда я нажимаю кнопку, он отправляет свойство Folder элемента данных, на котором основан этот список (член ItemsSource, который показывает текущий элемент списка).Однако мне нужен еще один фрагмент данных, свойство Filename текущего элемента.Для этого я создал новый класс FileInfo, который содержит свойства зависимостей для Folder и Filename.Затем я заменил код XAML ранее на:

<Button Command="local:MediaCommands.StreamVideo">
    <Button.CommandParameter>
        <data:FileInfo Folder="{Binding Path=Folder}"
            Filename="{Binding Path=Filename}" />
    </Button.CommandParameter>
</Button>

Однако, единственное, что мой код посылает мне, это пустой FileInfo объект.Обратите внимание, что если я изменю приведенный выше XAML для включения буквальных значений для Folder и Filename, код будет работать нормально в том смысле, что он правильно создает объект FileInfo и назначает правильные свойства.

Для справки мой класс FileInfo выглядит примерно так:

class FileInfo : DependencyObject {
    public static readonly DependencyProperty FolderProperty;
    public static readonly DependencyProperty FilenameProperty;
    static FileInfo() {
        FolderProperty = DependencyProperty.Register("Folder",
            typeof(string), typeof(FileInfo));
        FilenameProperty = DependencyProperty.Register("Filename",
            typeof(string), typeof(FileInfo));
    }
    public string Folder {
        get { return (string) GetValue(FolderProperty); }
        set { SetValue(FolderProperty, value); }
    }
    public string Filename {
        get { return (string) GetValue(FilenameProperty); }
        set { SetValue(FilenameProperty, value); }
    }
}

Игнорируя тот факт, что в этом случае я мог бы просто передать ссылку на сам объект данных (в моем реальном приложении янужно извлечь данные из пары вложенных ListBox с, но проблема та же), кто-нибудь может увидеть, что здесь происходит?Мои свойства зависимостей не были объявлены должным образом?Нужно ли делать что-то необычное с привязками?

1 Ответ

3 голосов
/ 21 сентября 2010

Привязки, которые явно не объявляют источник, полагаются на DataContext в качестве своего источника. Вы не объявили DataContext в экземпляре FileInfo, что обычно означает, что будет использоваться унаследованный DataContext. Наследование DataContext зависит как от FrameworkElement, так и от Visual Tree времени выполнения, ни один из которых не вступает в игру, когда вы используете производный класс не FrameworkElement, назначенный свойству, которое не отображается в дереве.

...