【问题标题】:WPF - DataTemplate - Using element binding within an attached propertyWPF - DataTemplate - 在附加属性中使用元素绑定
【发布时间】:2010-09-20 19:24:32
【问题描述】:

我正在开发一个使用格式丰富的 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); }
    }
}

忽略这样一个事实,在这种情况下,我可以简单地传递对数据对象本身的引用(在我的实际应用程序中,我需要从一对嵌套的ListBoxs 中提取数据,但问题是一样的) ,任何人都可以看到这里发生了什么吗?我的依赖属性没有正确声明吗?我需要对绑定做一些奇怪的事情吗?

【问题讨论】:

  • 非常令人费解。帮助我找出绑定问题的一件事是启用 Debug -> Exceptions -> Managed Debugging Assistants -> BindingFailure 下的 throwed 选项。如果您这样做,调试器可能会告诉您一些有用的信息。
  • 我启用了该功能,但它没有报告任何额外内容。它一定是别的东西。

标签: c# wpf xaml datatemplate


【解决方案1】:

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

【讨论】:

  • 我尝试让FileInfo 继承自FrameworkElement 而不是DependencyObject,但这并没有解决问题。我误读了您的解决方案吗?
  • John 还提到对象必须是可视树的一部分才能使 DataContext 继承工作。在您的情况下, FileInfo 不是。所以它不会拾取DataContext。无论如何,对于上述内容,一种可能的解决方案是拥有一个 IValueConverter,它在给定数据类的情况下返回 FileInfo 实例。这样做时,您的 CommandParameter 将被声明为
  • 我看到的问题(可能不是问题)是我的数据不仅仅是来自我的数据类。相反,我需要数据类中的一个字段和数据模板中其他元素 (ListBoxs) 中的两个字段。严格来说,我可以简单地不返回任何参数并编写按钮的回调函数,以便它遍历元素树,但这需要大量工作并且非常不雅。我觉得应该有更好的解决方案。
  • 要从多个对象中获取数据,您仍然可以使用@karmicpuppet 的建议,但使用 MultiValueConverter 传递多个绑定值以构建您的 FileInfo 对象。
猜你喜欢
  • 2020-07-07
  • 1970-01-01
  • 2015-09-09
  • 2013-07-27
  • 2018-04-26
  • 2017-02-26
  • 2011-02-23
  • 2022-01-14
相关资源
最近更新 更多