2009-12-08 59 views
0

如何將「myElement」的DataContext設置爲與XAML中的用戶控件相同的DataContext?我已經能夠通過代碼隱藏在UserControl構造函數中通過myElement.DataContext = this.DataContext來完成它,但我試圖瞭解如何在XAML中執行相同的操作。WPF - 如何在邏輯樹的虛擬分支上設置DataContext?

這與創建虛擬分支到邏輯樹有關(請參閱此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> 

回答

0

使用代碼隱藏竟然​​是到目前爲止,我已經找到了最簡單,最乾淨的解決方案:

myElement.DataContext = this.DataContext 
2

給頂級UserControl元素一個x:Name然後使用ElementName綁定。像這樣:

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

一個相關的解決方案是使用AncestorType類型用戶控件綁定(甚至他的自定義用戶控件類)。 – itowlson 2009-12-08 03:56:11

+1

我對Josh Smith寫的這個虛擬分支技術並不熟悉,但它似乎是邏輯樹會「斷開連接」,使AncestorType無法按預期工作。 – Josh 2009-12-08 04:03:28

+0

@Josh - 這是正確的。 FindAncestor在這種情況下不起作用,因爲myElement不是邏輯樹的一部分。 – 2009-12-08 04:26:42