2010-06-10 16 views
6

यह उदाहरण एक स्वीकार्य रूप से थोड़ा सा योगदान है लेकिन मैं कुछ ऐसा ही कर रहा हूं। मान लीजिए कि मैं निम्नलिखित सरल कक्षाओं करते हैं:क्या एक WPF डाटाबेसिंग निर्दिष्ट करने का कोई आसान तरीका है जहां पथ एक "स्तर" है?

public class Person 
{ 
    public string Name { get; set; } 
    public List<Alias> Aliases { get; set; } 
} 

public class Alias 
{ 
    public string AliasName { get; set; } 
} 

और कहते हैं कि मैं एक LayoutRoot ग्रिड के साथ Xaml है, और एक डेटा ग्रिड जहाँ मैं डेटा ग्रिड भीतर नाम संपत्ति का उपयोग करने की तरह उपनाम गुण के बजाय चाहते यहां दूसरे कॉलम में:

<Grid x:Name="LayoutRoot" DataContext="PersonInstance"> 
    <DataGrid ItemsSource="{Binding Aliases}"> 
     <DataGrid.Columns> 
      <data:DataGridTextColumn Header="AliasName" Binding="{Binding AliasName, Mode=TwoWay}"/> 
      <data:DataGridTextColumn Header="Name" Binding="{Binding ../Name, Mode=TwoWay}"/> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 

कि सहज है कि कैसे मैं नाम बाध्य करने के लिए प्रयास करेगी, लेकिन वह बेवकूफ लग रहा है कहने की। क्या पथ निर्दिष्ट करते समय ऐसा कुछ है, या क्या आप लेआउट रूट डेटा संदर्भ तक एक सापेक्ष स्रोत प्राप्त करने के लिए मजबूर हैं। यदि आपको करना है, तो सबसे प्रभावी तरीका क्या है?

+0

यह क्यों काम नहीं कर रहा है? 'बाध्यकारी =" {बाध्यकारी नाम, मोड = दोवे} "' – Amsakanna

+0

@ वीर, क्योंकि कक्षा उपनाम में कोई नाम संपत्ति नहीं है ... – Anvaka

+0

@Anvaka: लेकिन डेटाकॉन्टेक्स्ट व्यक्ति वर्ग का उदाहरण सेट किया गया है। यह नाम संपत्ति जानना चाहिए। – Amsakanna

उत्तर

10

यह आप के लिए काम करना चाहिए:

<DataGridTextColumn Header="Name" 
        Binding="{Binding RelativeSource={RelativeSource 
                 FindAncestor, 
                 AncestorLevel=3, 
                 AncestorType={x:Type Grid}, 
                 Mode=FindAncestor}, 
                Path=DataContext.Name}"/> 

आप में से किसी का उपयोग कर सकते हैं:

{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type 
desiredType}}} 

:

स्रोत तत्व दिए गए प्रकार का करीबी माता पिता के बराबर करने के लिए स्रोत तत्व को किसी दिए गए प्रकार के एनएच निकटतम अभिभावक के बराबर बनाने के लिए:

{Binding RelativeSource={RelativeSource FindAncestor, 
AncestorLevel=n, AncestorType={x:Type desiredType}}} 

स्रोत तत्व एक डेटा-बाउंड संग्रह में पिछले डेटा आइटम के बराबर करने के लिए:

{Binding RelativeSource={RelativeSource PreviousData}} 
+1

यह अपमानजनक वर्बोज़ है। आपका पहला उदाहरण लिखा जाना चाहिए '{बाध्यकारी सापेक्ष स्रोत = {सापेक्ष स्रोत ढूँढें पूर्वजों, ग्रिड, 3}} '। दूसरों को भी सरल बनाया जाना चाहिए। कोई भी जो FindAncestor के फ़ंक्शन को समझता है, वह 'FindAncestor, Grid, 3' को समझता है जैसे कोड की आपकी चार पंक्तियां, और कम सोच के साथ। –

0

मुझे लगता है कि पेड़ पर रिश्तेदार स्रोत का उपयोग करने से यह करने के लिए कोई बेहतर रास्ता है। आप अपने मॉडल को फिर से लिख सकते हैं (उदाहरण के लिए, Alias से पैरेंट Person का संदर्भ जोड़ें) लेकिन यह शायद ही बेहतर दृष्टिकोण है।

प्रदर्शन संभावना से मुझे सापेक्ष स्रोत बाइंडिंग में बाधाएं कभी नहीं मिलीं। हमेशा कुछ और होता है जो आपके ऐप को रॉकेट गति से दूर रखता है।

संबंधित मुद्दे

 संबंधित मुद्दे