2013-02-18 63 views
6

समस्या यह है कि RelativeSource निम्न मामले में काम नहीं करता है। मैं Silverlight 5.सापेक्ष स्रोत और पॉपअप

//From MainPage.xaml 
<Grid x:Name="LayoutRoot" Background="White" Height="100" Width="200"> 
    <Popup IsOpen="True"> 
     <TextBlock Text="{Binding Path=DataContext, RelativeSource={RelativeSource AncestorType=Grid}}" /> 
    </Popup> 
</Grid> 

//From MainPage.xaml.cs 
public MainPage() 
{ 
    InitializeComponent(); 
    DataContext = "ololo"; 
} 

का उपयोग करते हैं मैं बंधन पर एक ब्रेकपाइंट सेट, मैं त्रुटि मिल जाएगा:

System.Exception: BindingExpression_CannotFindAncestor.

अगर मैं ElementName=LayoutRoot बजाय RelativeSource उपयोग करते हैं, सब कुछ ठीक हो जाएगा।

संबंधित स्रोत बाध्यकारी क्यों काम नहीं करता है?

उत्तर

6

पॉपअप ContextMenu, टूलटिप नियंत्रणों की तरह है, वे VisualTree में नहीं जोड़े गए हैं। आप इस के लिए की तरह

<Grid x:Name="LayoutRoot" Height="100" Width="200" Background="Black"> 
    <Popup Grid.Row="0" x:Name="popup" DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Mode=Self}}"> 
     <TextBlock Text="{Binding DataContext, ElementName=popup}" Background="Red" Width="30" Height="30" /> 
    </Popup> 
</Grid> 

public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = "abcd"; 
     popup.PlacementTarget = LayoutRoot; 
    } 

करने के लिए मुझे आशा है कि इस ContextMenu या टूलटिप के मामले में की तरह help.Not जाएगा यहाँ आप भी PlacementTarget निर्दिष्ट करने के लिए ही होगी।

+1

ठीक है। यह पॉपअप नियंत्रण के लिए स्पष्ट है। क्या कॉम्बोबॉक्स ItemTemplate में सापेक्ष स्रोत का उपयोग करने का कोई तरीका है? –

-1

पॉपअप दृश्य पेड़ का हिस्सा नहीं हैं।

संबंधित स्रोत "बाध्यकारी लक्ष्य (एमएसडीएन) की स्थिति से संबंधित अपने स्थान को निर्दिष्ट करके बाध्यकारी स्रोत प्राप्त करता है या सेट करता है"। चूंकि पॉपअप नियंत्रण के दृश्य पेड़ का हिस्सा नहीं हैं जो इसे दिखा रहा है, यह पॉपअप के बाहर कुछ भी हल करने में सक्षम नहीं होगा।

1

आप छोटे हैक बना सकते हैं: संसाधनों के माध्यम से डेटाकॉन्टेक्स्ट सेटअप करें।

<Grid.Resources> 
    <Style TargetType="TextBlock"> 
     <Setter Property="DataContext" Value="{Binding ElementName=myGrid, Path=DataContext}" /> 
    </Style> 
</Grid.Resources> 
2

जैसा कि अन्य ने उल्लेख किया है, ऐसा इसलिए है क्योंकि पॉपअप दृश्य पेड़ का हिस्सा नहीं है। इसके बजाय, आप वापस दृश्य पेड़ को पाने के लिए पॉपअप के PlacementTarget संपत्ति का उपयोग कर सकते हैं:

<Grid x:Name="LayoutRoot" Background="White" Height="100" Width="200"> 
    <Popup IsOpen="True"> 
     <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Popup}}, 
            Path=PlacementTarget.DataContext}" /> 
    </Popup> 
</Grid>