Wpf 当前绑定值

Wpf 当前绑定值,wpf,binding,markup-extensions,Wpf,Binding,Markup Extensions,我正在编写标记扩展。我有这样的XAML <TextBlock Text="{ui:Test SomeInfo}" /> 和TestExtension,构造函数使用一个字符串参数。我得到“SomeInfo”字符串,所以所有东西都可以找到。现在我想嵌套扩展并编写如下内容 <TextBlock Text="{ui:Test {Binding PropName}}" /> 但它并没有按原样工作。我必须添加一个构造函数,该构造函数接受System.Windows.Dat

我正在编写标记扩展。我有这样的XAML

<TextBlock Text="{ui:Test SomeInfo}" />

和TestExtension,构造函数使用一个字符串参数。我得到“SomeInfo”字符串,所以所有东西都可以找到。现在我想嵌套扩展并编写如下内容

<TextBlock Text="{ui:Test {Binding PropName}}" />

但它并没有按原样工作。我必须添加一个构造函数,该构造函数接受System.Windows.Data.Binding类型的一个参数

现在我需要知道

  • 如何从绑定对象检索当前值
  • 我应该什么时候做?我应该以某种方式订阅更改,还是每次都在ProviderValue方法中请求该值

  • Update1PropName应该根据TextBlock的DataContext进行解析


    Update2刚刚发现相关问题:

    像这样的绑定将无法工作,因为您的
    标记扩展名没有
    DataContext
    ,并且它不会出现在可视化树中,我认为您不应该直接与绑定对象交互。你真的需要这个分机吗?也许你可以一个人用装订和一张支票

    如果没有,则可以创建一个具有可绑定属性的专用类(通过继承
    DependencyObject
    ),但这仍然不会为
    元素名所需的
    数据上下文
    或名称范围,也不会为
    相对资源
    提供所需的可视化树,因此,在这种情况下使绑定工作的唯一方法是使用
    源代码(例如,将其设置为
    StaticResource
    )。这并不理想


    另外请注意,如果不直接设置绑定,
    ProvideValue
    方法将只被调用一次,这意味着即使扩展中有绑定,它也可能不是很有用(除了一些例外,例如在返回复杂内容时,例如使用绑定的
    ItemsControl
    ,但您将扩展名设置为
    TextBlock.Text
    ,它只是一个字符串)所以,我真的怀疑,如果这个值应该根据绑定动态地改变,那么你想使用一个MARUPUPPORE。如前所述:考虑或使用不同的值。

    绑定不起作用,因为你的<代码>标记扩展> <代码>没有<代码> DATACONTEXT/<代码>,并且它没有出现在可视化树中。我不认为你应该直接与绑定对象交互。你真的需要这个扩展吗?也许你可以单独使用绑定和一个绑定

    如果不是,您可以创建一个具有可绑定属性的专用类(通过继承
    DependencyObject
    )但是,这仍然不会为您提供
    元素名称所需的
    数据上下文
    或名称范围,或者
    相对资源
    所需的可视化树,因此在这种情况下,使绑定工作的唯一方法是使用
    (例如,将其设置为
    静态资源
    ),这很难理想


    另外请注意,如果不直接设置绑定,
    ProvideValue
    方法将只被调用一次,这意味着即使扩展中有绑定,它也可能不是很有用(除了一些例外,例如在返回复杂内容时,例如使用绑定的
    ItemsControl
    ,但您将扩展名设置为
    TextBlock.Text
    ,它只是一个字符串)所以,我真的怀疑,如果这个值应该根据绑定动态地改变,那么你想使用一个MARUPUPPORE。正如前面提到的:考虑或使用不同的值。实际上,我想使用TrutBug的DATACONTEXT。@ Adutz:正如我所说的,你最好使用一个与转换器的正常绑定,获得绑定。在您自己的MarkupExtension中使用gs是一件痛苦的事。我接受这种痛苦,因为它为标记用户提供了更一致的语法,这对我来说很重要。@adontz:MarkupExtension到底做什么,以及语法应该如何更一致,如果您继续使用标记扩展,您将不得不使用元素语法,例如e:
    ,它会把事情搞砸,为了进入数据上下文,您可能需要在参考资料中定义部分,这几乎肯定不值得。@adontz:从绑定中,您可以使用
    ProvideValue
    获得一个
    绑定表达式,但据我所知,这就是它停止的地方。除此之外的一切都是WPF bi的内部内容在绑定引擎中,您自己无法完全解析绑定。正如我所解释的,MarkupExtensions本身缺少绑定所需的一切,它们不是可绑定的对象。实际上,我想使用Textblock的DataContext。@adontz:正如我所说,您最好使用带转换器的普通绑定,将绑定n让自己的MarkupExtension工作是一件痛苦的事。我接受这种痛苦,因为它为标记用户提供了更一致的语法,这对我来说很重要。@adontz:MarkupExtension到底做什么,以及语法应该如何更一致,如果你继续保持标记扩展,你将不得不使用元素语法,如:
    ,它会把事情搞砸,为了进入DataContext,您可能需要在参考资料中定义部分,这几乎肯定是不值得的。@adontz:从绑定中,您可以使用
    ProvideValue
    获得一个
    BindingExpression
    ,但据我所知,这就是它停止的地方。除此之外的一切都是WPF的bindin的内部内容正如我所解释的,MarkupExtensions本身缺乏绑定所需的一切,它们不是可绑定的对象。