【问题标题】:WPF - How to set DataContext on virtual branch of logical tree?WPF - 如何在逻辑树的虚拟分支上设置 DataContext?
【发布时间】:2009-12-08 03:45:38
【问题描述】:

如何将“myElement”的 DataContext 设置为与 XAML 中的用户控件相同的 DataContext?我已经能够通过 UserControl 构造函数中的myElement.DataContext = this.DataContext 在代码隐藏中做到这一点,但我试图了解如何在 XAML 中做同样的事情。

这与创建逻辑树的虚拟分支有关(参见article)。

<UserControl ... DataContext="{Binding RelativeSource={RelativeSource self}}">
    ...
    <TextBox Name="myTextBox">    
        <TextBox.Text>        
            <Binding Path="MySource" UpdateSourceTrigger="PropertyChanged">
                <Binding.ValidationRules>             
                    <base:StringEqualsRules>
                        <base:StringEqualRule.BoundElement>
                            <base:ValidationRuleElement 
                                x:Name="myElement"
                                DataContext="???"
                                Value="{Binding MyProperty}" />
                        </base:StringEqualRule.BoundElement>
                    </base:StringEqualsRule>
                 </Binding.ValidationRules>
             </Binding>    
         </TextBox.Text>
    </TextBox>
    ...
</UserControl>

【问题讨论】:

    标签: c# .net wpf data-binding xaml


    【解决方案1】:

    给顶级 UserControl 元素一个 x:Name 然后使用 ElementName 绑定。像这样:

    <UserControl ... x:Name="Root" DataContext="...">
        <SomeNestedChild DataContext="{Binding DataContext, ElementName=Root}" />
    </UserControl>
    

    【讨论】:

    • 一个相关的解决方案是对 UserControl 类型(甚至他的自定义用户控件类)使用 AncestorType 绑定。
    • 我不熟悉 Josh Smith 所写的这种虚拟分支技术,但似乎逻辑树会以某种方式“断开”,导致 AncestorType 无法按预期工作。
    • @Josh - 没错。 FindAncestor 在这种情况下不起作用,因为 myElement 不是逻辑树的一部分。
    • 我会试试这个解决方案,看看会发生什么。
    • 看起来使用 ElementName 进行绑定也不起作用,因为 myElement 不是逻辑树的一部分。有没有办法使用动态/静态资源来进行这种绑定?
    【解决方案2】:

    使用代码隐藏是迄今为止我发现的最简单、最干净的解决方案:

    myElement.DataContext = this.DataContext
    

    【讨论】:

      猜你喜欢
      • 2014-05-11
      • 2021-04-27
      • 1970-01-01
      • 2013-02-13
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 2016-04-01
      • 1970-01-01
      相关资源
      最近更新 更多