WPF - DataTemplate - 在附加属性中使用元素绑定

时间:2010-09-20 19:24:33

标签: c# wpf xaml datatemplate

我正在使用一个使用格式丰富的ListBox的应用程序。我需要的一件事是将多条信息绑定到ListBox的DataTemplate中的按钮。

这是我为帮助您理解问题而实际编写的代码的过度简化。

以下是DataTemplate内部的一大块XAML:

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

当我按下按钮时,它会发送此列表所基于的数据项的Folder属性(当前列表项显示的ItemsSource成员)。但是,我需要另一条数据,即当前项的Filename属性。为此,我设置了一个新类FileInfo,其中包含FolderFilename的依赖项属性。之后我用:

替换了XAML代码
<Button Command="local:MediaCommands.StreamVideo">
    <Button.CommandParameter>
        <data:FileInfo Folder="{Binding Path=Folder}"
            Filename="{Binding Path=Filename}" />
    </Button.CommandParameter>
</Button>

然而,我的代码唯一发送给我的是一个空白FileInfo对象。请注意,如果我将上面的XAML更改为包含FolderFilename的文字值,则代码可以正常工作,因为它正确创建了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 个答案:

答案 0 :(得分:3)

未明确声明Source的绑定依赖于DataContext作为其源。您尚未在FileInfo实例上声明DataContext,这通常意味着将使用继承的DataContext。 DataContext继承依赖于FrameworkElement和运行时Visual Tree,当您使用分配给未在树中显示的属性的非FrameworkElement派生类时,它们都不起作用。