2009-04-01 16 views
9

में बाध्यकारी जटिल गुण कहते हैं कि मैं एक कस्टम डेटा प्रकार है कि कुछ इस तरह दिखता है की सुविधा देता है। xaml कोड में परिभाषित बाध्यकारी जटिल संपत्ति के उपप्रोपर्टी को कैसे जोड़ना चाहती है? मैंने सोचा था कि यह कुछ इस तरह दिखना चाहिए:सिल्वरलाइट/WPF

<TextBox Text="{Binding simpleSubProp, path=ComplexProp[0]}" /> 

या

<TextBox Text="{Binding path=ComplexProp[0].simpleSubProp}" /> 

लेकिन उन दोनों ने मुझे xml पार्स त्रुटि दे। यह सही तरीके से कैसे दिखना चाहिए? सोफे में एक संग्रह संपत्ति के एक विशिष्ट आइटम को संदर्भित करना भी संभव है? यदि यह नहीं है, तो मेरे पास अन्य विकल्प क्या हैं?

संपादित करें, परिदृश्य काफी स्पष्ट होना प्रतीत नहीं होता है:

मैं एक

IEnumberable<MyDataType> 

कि एक ItemsControl के लिए बाध्य है है, DataTemplate अंदर मैं कई बक्सें कि का उल्लेख करने की जरूरत है जटिल संपत्ति की सूची में किसी ऑब्जेक्ट की उपप्रोपर्टीज।

उत्तर

7

ऐसा लगता है कि रजत रोशनी सूचकांक Silverlight Indexers in property paths are broken में टूटा हुआ है। इसके आस-पास जाने का तरीका पोस्ट में सुझाया गया है और एक IValueConverter का उपयोग करने के लिए है।

XAML

<UserControl x:Class="Silverlight.Mine.Page" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:sys="System" 
    xmlns:sm="clr-namespace:Silverlight.Mine;assembly=Silverlight.Mine" 
    Width="400" Height="300"> 
    <UserControl.Resources> 
     <sm:SomeTypeConverter x:Key="MySomeTypeConverter" /> 
    </UserControl.Resources>  
    <Grid x:Name="LayoutRoot" Background="White"> 
     <TextBlock x:Name="myTextBlock" Text="{Binding Path=SomeDates, Converter={StaticResource MySomeTypeConverter}}" /> 
    </Grid> 
</UserControl> 

सी # Page.xaml.cs

namespace Silverlight.Mine 
{ 
    public partial class Page : UserControl 
    { 
     private SomeType m_mySomeType = new SomeType(); 

     public Page() 
     { 
      InitializeComponent(); 
      myTextBlock.DataContext = m_mySomeType; 
     } 
    } 
} 

सी # SomeType.cs

namespace Silverlight.Mine 
{ 
    public class SomeType 
    { 
     public List<DateTime> SomeDates { get; set; } 

     public SomeType() 
     { 
      SomeDates = new List<DateTime>(); 
      SomeDates.Add(DateTime.Now.AddDays(-1)); 
      SomeDates.Add(DateTime.Now); 
      SomeDates.Add(DateTime.Now.AddDays(1)); 
     } 
    } 

    public class SomeTypeConverter : IValueConverter 
    { 
     public object Convert(object value, 
         Type targetType, 
         object parameter, 
         CultureInfo culture) 
     { 
      if (value != null) 
      { 
       List<DateTime> myList = (List<DateTime>)value; 
       return myList[0].ToString("dd MMM yyyy"); 
      } 
      else 
      { 
       return String.Empty; 
      } 
     } 

     public object ConvertBack(object value, 
           Type targetType, 
           object parameter, 
           CultureInfo culture) 
     { 
      if (value != null) 
      { 
       return (List<DateTime>)value; 
      } 
      return null; 
     } 
    } 
} 
+0

मैं इसे आज़मा दूंगा, थक्स! – gsnerf

1

मुझे यकीन नहीं है कि आप ऐसा कर सकते हैं। आम तौर पर आप किसी सूची बॉक्स (या किसी अन्य "दोहराव" नियंत्रण) की सूची में बाध्य करेंगे और उसके अंदर प्रत्येक आइटम सूची में रिलीज तत्व से जुड़ने में सक्षम होगा।

+0

मैंने शायद यह स्पष्ट नहीं किया हो सकता है, मेरे पास आइटम्स कंट्रोल से जुड़ा एक आईनेमेरेबल है। मेरे आइटम नियंत्रण के डेटा टेम्पलेट के अंदर मुझे जटिल संपत्ति में किसी विशिष्ट आइटम की उपप्रोपर्टी का संदर्भ देने की आवश्यकता है। आपके जवाब के लिए – gsnerf

2

{बाइंडिंग कॉम्प्लेक्सप्रॉप (0) .simpleSubProp} आज़माएं। यदि यह काम नहीं करता है, तो आप इसे करने के लिए एक सरल कनवर्टर भी लिख सकते हैं।

+0

Thx, दुर्भाग्य से यह मुझे एक सिस्टम देता है। ऑर्ग्यूमेंट अपवाद "अमान्य बाध्यकारी पथ; चरित्र"। इस तरह के लिए कनवर्टर कैसा दिखता है? मैंने सोचा कि कनवर्टर्स को मानक तरीके से डेटा बनाने के लिए इस्तेमाल किया जाएगा – gsnerf

1

Path Syntax on MSDN के अनुसार, तुम सिर्फ कर सकते हैं:

<TextBox Text="{Binding ComplexProp[0].simpleSubProp}" /> 

यह लोअरकेस "पथ =" है कि आप त्रुटियों दे दी हो सकता है? "पथ =" आज़माएं। साथ ही, यह सुनिश्चित नहीं है कि यह सिल्वरलाइट में काम करता है ...

+0

वह पृष्ठ WPF के लिए है, सिल्वरलाइट नहीं। सिल्वरलाइट बाध्यकारी में अनुक्रमित गुणों का समर्थन नहीं करता है। – mattmanser

+0

प्रश्न का शीर्षक "सिल्वरलाइट/डब्ल्यूपीएफ" कहता है। –

+0

इंडेक्सिंग विधि केवल कुछ मामलों के लिए चांदी की रोशनी में काम करती है, फिर भी! – gsnerf

4

मैं बात इस तरह का हर समय करते हैं, वहाँ दो तरीके हैं मैं इस समस्या से संपर्क करता हूं कि आप इसके बारे में क्या चाहते हैं।

यदि आप वास्तव में केवल सूची के एक विशिष्ट सदस्य को चाहते हैं, तो आप कनवर्टर का उपयोग कर सकते हैं।XAML कुछ इस तरह दिखेगा:

<TextBox Text="{Binding MyDataTypeInstance, Converter={StatacResources SpecificInstanceConverter}}" /> 

कि आम तौर पर मैं क्या हालांकि जरूरत है, आम तौर पर मैं पूरी comlex वस्तु प्रदर्शित करने के लिए एक नियंत्रण की जरूरत है, तो ऐसा तरीका यह है अधिक की तरह इस प्रकार करना है नहीं है:

<StackPanel> 
    <Textblock Text="{Binding SimpleProp1}"/> 
    <TextBlock Text="{Bidning SimpleProp2}"/> 
    <ItemsControl ItemsSource="{Binding ComplexProp}> 
      <ItemsControl.ItemsTemplate> 
       <DataTemplate> 
        <StackPanel> 
         <TextBlock Text="{Binding ComplexPropertyName}/> 
         <InputToolkit:NumericUpDown Value="{Binding ComplexPropertyValue}/> 
        </StackPanel> 
       </DataTemplate> 
      </ItemsControl.ItemsTemplate> 
    </ItemsControl> 
</StackPanel> 

मैं इस विधि की तरह क्योंकि मेरी जीयूआई मेरे व्यापार वस्तुओं से मेल खाता है, और एक परिणाम के रूप में यह आम तौर पर अगर मैं में कोड-पीछे विशिष्ट अनुक्रमणिका के लिए जाँच कर रहा हूँ की तुलना में बहुत क्लीनर समाप्त होता है।

1

इस तरह से सामान्यीकृत करने के लिए, मेरा सुझाव है कि आप दूसरों द्वारा उल्लिखित मूल्य कनवर्टर का उपयोग करें और इंडेक्स पास करने के लिए कनवर्टर पैराम विकल्प का उपयोग करें।

2

यह अब सिल्वरलाइट 4 में ठीक काम करता है

एक बात नोट करने के लिए, वर्ग तीन सार्वजनिक क्षेत्रों है। उन्हें गुणों में बदलें (और INOTifyProperty को भी लागू करने का विचार होगा) और फिर निम्न कोड काम करता है।

<StackPanel> 
    <TextBlock Text="{Binding Path=SimpleProp1}" /> 
    <TextBox Text="{Binding Path=ComplexProp[0].SimpleSubProp, Mode=TwoWay}" Width="200" Height="60"/> 
</StackPanel> 

केस भी महत्वपूर्ण है क्योंकि बाइंडिंग केस संवेदनशील हैं।