2010-06-17 22 views
11

WPF4.0 में, मेरे पास एक कक्षा है जिसमें गुणों के रूप में अन्य वर्ग प्रकार शामिल हैं (प्रदर्शन के लिए एकाधिक डेटा प्रकारों को जोड़ना)। कुछ की तरह:आइटम नियंत्रण आइटम टेम्पलेट बाध्यकारी

public partial class Owner 
{ 
    public string OwnerName { get; set; } 
    public int OwnerId { get; set; } 
} 

partial class ForDisplay 
{ 
    public Owner OwnerData { get; set; } 
    public int Credit { get; set; } 
} 

मेरी विंडो में, मैं के साथ एक ItemsControl है निम्नलिखित (स्पष्टता के लिए काटा गया):

<ItemsControl ItemsSource={Binding}> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <local:MyDisplayControl 
       OwnerName={Binding OwnerData.OwnerName} 
       Credit={Binding Credit} /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

मैं तो डेटा स्तर से प्रदर्शन जानकारी का एक संग्रह मिलता है, और सेट इस संग्रह में ItemsControl के DataContext। "क्रेडिट" संपत्ति सही ढंग से प्रदर्शित हो जाती है, लेकिन मालिक नाम संपत्ति नहीं है।

Error 40: BindingExpression path error: 'OwnerName' property not found on 'object' ''ForDisplay' (HashCode=449124874)'. BindingExpression:Path=OwnerName; DataItem='ForDisplay' (HashCode=449124874); target element is 'TextBlock' (Name=txtOwnerName'); target property is 'Text' (type 'String')

मुझे समझ नहीं आता क्यों इस ForDisplay वर्ग में नहीं बल्कि ForDisplay OwnerData संपत्ति से मालिक वर्ग की तुलना में OwnerName संपत्ति देखने के लिए, प्रयास कर रहा है: इसके बजाय, मैं एक बाध्यकारी त्रुटि मिलती है।

संपादित करें ऐसा प्रतीत होता है कि कस्टम नियंत्रण का उपयोग करने के साथ इसका कुछ संबंध है। यदि मैं एक ही गुण को TextBlock पर बांधता हूं, तो वे सही तरीके से काम करते हैं।

<ItemsControl ItemsSource={Binding}> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <local:MyDisplayControl 
         OwnerName={Binding OwnerData.OwnerName} 
         Credit={Binding Credit} /> 
       <TextBlock Text="{Binding OwnerData.OwnerName}" /> 
       <TextBlock Text="{Binding Credit}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 
+2

किसी तरह, यह ForDisplay वस्तु पर OwnerName संपत्ति खोजने की कोशिश कर रहा है। डीबग करने के लिए निम्न लिंक का उपयोग करें: http://wpftutorial.net/DebugDataBinding.html। एक और सवाल, क्या आपके MyDisplayControl पर मालिक नाम संपत्ति एक निर्भरता संपत्ति है? – decyclone

+1

मुझे कुछ भी गलत नहीं लगता है, यह मानते हुए कि आपने जो क्लिप किया है वह कुछ भी प्रासंगिक नहीं है। क्या आपने समाधान के साफ/पुनर्निर्माण की कोशिश की है? मुझे इस सुझाव से नफरत है क्योंकि यह आपको "रीबूट" करने के लिए कहने के बराबर है, लेकिन मेरे पास एक डाटाबेसिंग स्थिति है जो काम करना चाहिए लेकिन नहीं, मुझे लगता है कि एक साफ/पुनर्निर्माण कभी-कभी इसे ठीक करता है। यकीन नहीं है कि क्यों। –

+0

एक अनुमानित अनुमान: पथ को स्पष्ट रूप से सेट करने के लिए बाध्यकारी बदलें। यानी "मालिक नाम = {बाध्यकारी पथ = मालिक डेटा .ऑनर नाम}" –

उत्तर

7

क्या आप सुनिश्चित हैं कि आपने जिस कोड को पोस्ट किया है वह वह कोड है जिसका उपयोग आप अपने समाधान में करते हैं? क्योंकि, इस कोड को मेरे लिए काम करता है:

XAML

<ItemsControl ItemsSource="{Binding}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <TextBlock Text="{Binding OwnerData.OwnerName}"></TextBlock> 
       <TextBlock Text="{Binding Credit}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

विंडो की लोडेड घटना

ObservableCollection<ForDisplay> items = new ObservableCollection<ForDisplay>(); 

for (int i = 0; i < 10; i++) 
{ 
    items.Add(new ForDisplay() { OwnerData = new Owner() { OwnerId = i + 1, OwnerName = String.Format("Owner #{0}", i + 1) }, Credit = i + 1 }); 
} 

DataContext = items; 
+0

पर NullReferenceException फेंक रहा है, मुझे लगता है कि इसका कस्टम नियंत्रण के साथ कुछ करना है। प्रश्न का संपादन देखें। –

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