我正在使用一个使用格式丰富的ListBox的应用程序。我需要的一件事是将多条信息绑定到ListBox的DataTemplate中的按钮。
这是我为帮助您理解问题而实际编写的代码的过度简化。
以下是DataTemplate内部的一大块XAML:
<Button Command="local:MediaCommands.StreamVideo"
CommandParameter="{Binding Path=Folder}" />
当我按下按钮时,它会发送此列表所基于的数据项的Folder
属性(当前列表项显示的ItemsSource
成员)。但是,我需要另一条数据,即当前项的Filename
属性。为此,我设置了一个新类FileInfo
,其中包含Folder
和Filename
的依赖项属性。之后我用:
<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
中提取数据,但问题是同样),谁能看到这里发生了什么?我的依赖属性没有被正确声明?我是否需要对绑定做一些古怪的事情?
答案 0 :(得分:3)
未明确声明Source的绑定依赖于DataContext作为其源。您尚未在FileInfo实例上声明DataContext,这通常意味着将使用继承的DataContext。 DataContext继承依赖于FrameworkElement和运行时Visual Tree,当您使用分配给未在树中显示的属性的非FrameworkElement派生类时,它们都不起作用。