2009-02-24 10 views
5

इस का उत्तर नहीं मिला।WPF - प्रोग्रामेटिक रूप से जोड़े गए GridViewColumns के लिए DataTemplate सेट करें

मेरे पास एक WPF ListView नियंत्रण है जिसमें विभिन्न कॉलम हो सकते हैं। उदाहरण के लिए, यह ग्राहक डेटा प्रदर्शित कर सकता है, कॉलम आईडी, नाम, ईमेल इत्यादि प्रदर्शित कर सकता है, या इसमें उत्पादों, आईडी, नाम, मूल्य, संख्याइनस्टॉक, निर्माता, अच्छी तरह से प्रदर्शित करने वाले उत्पाद शामिल हो सकते हैं, आपको विचार मिलता है: कॉलम की अलग-अलग संख्या, अलग-अलग नाम।

मैं क्या करना चाहता हूं, कुछ स्तंभों के लिए डेटा को अलग-अलग प्रदर्शित करना है। उदाहरण के लिए, कॉलम नंबरइनस्टॉक के मान के रूप में 'हां' या 'नहीं' प्रिंट करने की बजाय, मैं एक साफ छवि प्रदर्शित करना चाहता हूं।

यदि मेरे पास निश्चित नामों के साथ निश्चित कॉलम होंगे, तो मैं देखता हूं कि यह कैसे आसान है। बस उस विशेष कॉलम के लिए डेटा टेम्पलेट को परिभाषित करें और मैं इसका उपयोग अपने कॉलम के दृश्य को परिभाषित करने के लिए करता हूं। हालांकि, मैं नहीं देख सकता कि यह मेरी स्थिति में कैसे किया जाए।

मैं WPF के लिए बहुत नया हूं, इसलिए मेरा दृष्टिकोण खराब होने पर मुझे क्षमा करें :-) मेरे एक्सएएमएल में, मैंने एक सूची दृश्य नियंत्रण परिभाषित किया है, जो कि काफी खाली है। पीछे मेरी कोड में, मैं का उपयोग करें:

// get all columns from my objects (which can be either a Customer of Product) 
    foreach (string columnName in MyObject.Columns) 
     { 
      GridViewColumn column = new GridViewColumn(); 
      // Bind to a property of my object 
      column.DisplayMemberBinding = new Binding("MyObject." + columnName); 
      column.Header = columnName; 
      column.Width = 50; 
      // If the columnname is number of stock, set the template to a specific datatemplate defined in XAML 
      if (columnName == "NumberInStock") 
      column.CellTemplate = (DataTemplate)FindResource("numberInStockImageTemplate"); 
      explorerGrid.Columns.Add(column); 
     } 

ठीक है, मुझे यकीन है कि यह एक सा खूबसूरत किया जा सकता है (यदि आप को कोई सलाह है, तो कृपया!), लेकिन सबसे बड़ी समस्या यह है कि मैं किसी भी नहीं देख सकते हैं कॉलम में अंतर। यह सिर्फ 'NumberInStock' कॉलम का टेक्स्ट मान प्रदर्शित करता है। मेरे DataTemplate XAML में परिभाषित किया गया है:

<Window.Resources> 
<DataTemplate x:Name="NumberInStock" x:Key="NumberInStock"> 
     <Border BorderBrush="Red" BorderThickness="2.0"> 
     <DockPanel> 
      <Image Width="24" Height="24" Margin="3,0" Source="..\Images\instock.png" /> 
     </DockPanel> 
     </Border> 
</DataTemplate> 
</Window.Resources> 
बेशक

, मैं अभी भी कार्यक्षमता है कि यह प्रदर्शित होता जोड़ना होगा एक 'हां' या 'नहीं' छवि NumberInStock के मूल्य के आधार हैं, लेकिन वह कदम है 2 वास्तव में। मुझे अपनी सूची दृश्य में एक छवि और लाल सीमा देखने में खुशी होगी!

अग्रिम धन्यवाद, रेज़ी

उत्तर

7

यह मुझे थोड़ी देर के लिए छोड़ दिया।

DisplayMemberBinding और CellTemplate परस्पर अनन्य हैं। DisplayMemberBinding निर्दिष्ट करने से CellTemplate को अनदेखा किया जा सकता है।

MSDN से

:

निम्नलिखित गुण सभी उपयोग किया जाता है एक स्तंभ कोशिका की सामग्री और शैली को परिभाषित करने के लिए, और से उच्चतम सबसे कम करने के लिए श्रेष्ठता के अपने आदेश में यहाँ सूचीबद्ध हैं,:

* DisplayMemberBinding 
* CellTemplate 
* CellTemplateSelector 

इसके अलावा इस बारे में C# Disciples post देखते हैं।

+0

धन्यवाद, यह वास्तव में समस्या की तरह दिखता है। एसपी 1 के साथ आने वाले डेटाग्रिड नियंत्रण का उपयोग करने के लिए मैंने पहले से ही अपना कोड संपादित किया है। वैसे भी मेरी स्थिति में यह अधिक उपयुक्त हो सकता है। लेकिन यह निश्चित रूप से सही समाधान है। बहुत धन्यवाद! – Razzie

0

मुझे लगता है कि समस्या यह है कि स्ट्रिंग है कि आप FindResource() को गुजर रहे हैं संसाधन है कि आप XAML में परिभाषित के प्रमुख से मेल नहीं खाता है। इसके बजाए "NumberInStock" पास करने का प्रयास करें और देखें कि क्या यह काम करता है।

+0

तीव्र सम्मिलित करने के लिए सबसे आसान तरीका है! दुर्भाग्यवश, यह मेरी तरफ से केवल एक कॉपी-पेस्ट-एडिट-फॉर-एक्ट त्रुटि थी।यह मेरे कोड में सही कुंजी को इंगित करता है। इसके अलावा, जब कुंजी नहीं मिलती है तो FindResource (स्ट्रिंग) एक अपवाद फेंकता है। फिर भी धन्यवाद! – Razzie

2

इस एक तस्वीर

 GridViewColumn column = new GridViewColumn { Header = "IM" };    
     DataTemplate template = new DataTemplate(); 

     FrameworkElementFactory factory = new FrameworkElementFactory(typeof(Grid)); 
     template.VisualTree = factory; 
     FrameworkElementFactory imgFactory = new FrameworkElementFactory(typeof(Image)); 

     Binding newBinding = new Binding("IMG"); 
     imgFactory.SetBinding(Image.SourceProperty,newBinding); 
     imgFactory.SetValue(Image.WidthProperty,15.0); 
     imgFactory.SetValue(Image.HeightProperty, 15.0); 

     factory.AppendChild(imgFactory); 
     column.CellTemplate = template; 
     view.Columns.Add(column); 

     ListViewMain.View = view; 

+0

कुछ और व्याख्या उपयोगी होगी, लेकिन यह मुझे सही उत्तर (मेरे मामले पर) का नेतृत्व करती है। संक्षेप में: केवल इस एक स्तंभ के लिए सामग्री निर्माता उत्पन्न होगा, तो प्रत्येक पंक्ति कारखाने factory._ पर परिभाषित नियंत्रण उत्पन्न करने के लिए कहा जाता है धन्यवाद .. +1 –

+0

यह शैली मेरे लिए काम किया। नोट: मेरे बाध्यकारी एक बच्चे वस्तु संपत्ति का एक संपत्ति के लिए गया था, तो यह इस तरह देखा: 'newBinding = नए बाध्यकारी (" ChildProp.SubProp ") बाइंडिंग; newBinding.Converter = नया MyConverter(); ' –

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