2016-02-05 5 views
7

है, मैं ExpandoObject से डेटा का उपयोग करके एक पंक्ति जोड़ना चाहता हूं, जो Dictionary<string, object> के समान है। string कॉलम का शीर्षलेख है और object का मान स्तंभ का मान है। हर बार, जब मुझे नया डेटा मिलता है तो मैं एक नया GridView बना रहा हूं, क्योंकि कॉलम की संख्या अलग हो सकती है। List में MyItems सभी पंक्तियां Dictionary<string, object> हैं, जिन्हें मैं अपने विचार में दिखाना चाहता हूं।सूचीदृश्य में कॉलम जोड़ें जिसमें एक छवि

  List<Column> columns = new List<Column>(); 

      myItemValues = (IDictionary<string, object>)myItems[0]; 
      // Key is the column, value is the value 
      foreach (var pair in myItemValues) 
      { 
       Column column = new Column(); 
       column.Title = pair.Key; 
       column.SourceField = pair.Key; 
       columns.Add(column); 
      } 
      view.Columns.Clear(); 
      foreach (var column in columns) 
      { 
       Binding binding = new Binding(column.SourceField); 
       if (column.SourceField == "Icon") 
       { 
        view.Columns.Add(new GridViewColumn 
        { 
         Header = column.Title, 
         DisplayMemberBinding = binding, 
         CellTemplate = new DataTemplate(typeof(Image)) 
        }); 
       } 
       else 
       { 
        view.Columns.Add(new GridViewColumn { Header = column.Title, DisplayMemberBinding = binding }); 
       } 
      } 

डायरेक्ट इस के बाद मैं पंक्तियों को जोड़ने का प्रयास:

  foreach (dynamic item in myItems) 
      { 
       this.listView.Items.Add(item); 
      } 

मैं एक अन्य उद्देश्य के लिए इस solution को संशोधित करने के लिए tryed

यह कैसे मैं मेरे विचार में कॉलम जोड़ने है। यह समाधान, बहुत अच्छी तरह से काम करता है अगर मैं केवल प्रकार string के मूल्यों को जोड़ना चाहते हैं, लेकिन अब मैं भी gridview में एक image प्रदर्शित करना चाहते हैं, लेकिन अगर मैं अपने gridview करने के लिए एक जोड़ने के लिए, यह मेरे बस पता चलता है:

"System.Windows.Controls.Image"

अब मैं, जानना चाहते हैं कि मैं इतना के रूप में मैं एक gridview में किसी भी प्रकार के (या कम से कम images और strings) प्रदर्शित कर सकते हैं मेरे कोड को संशोधित कर सकते हैं या मेरे पास हैं एक पूरी तरह से नए तरीके का उपयोग करने के लिए और रास्ता होगा?

संपादित करें: पिछले दृष्टिकोणों में, यह कहा गया था, मैं एक नया DataTemplate बनाने के लिए एक छवि दिखाने की जरूरत है, लेकिन मैंने पाया समाधान (Solution 1, Solution 2) में से कोई भी मेरे लिए काम कर रहा है।

+0

'Ce सेट करने का प्रयास लूप में डेटा के प्रकार के आधार पर कॉलम के लिए llTemplate' जहां आप कॉलम बनाते हैं। यह एक कॉलम हमेशा एक ही प्रकार के डेटा दिखाता है। यदि डेटा का प्रकार पंक्ति से पंक्ति में बदल सकता है, तो आप 'CellTemplateSelector' जोड़ सकते हैं ताकि उचित टेम्पलेट का उपयोग किया जा सके। – Shadowed

+0

मैंने एक नया 'डेटा टेम्पलेट' बनाया और 'टाइपटाइप' को 'टाइपऑफ (छवि)' पर सेट किया। क्या मुझे और गुण सेट करना है? क्योंकि मुझे अभी भी एक ही परिणाम मिल रहा है। – daniel59

+0

मैंने डेटा टेम्पलेट बनाने के लिए इन समाधानों का प्रयास किया: http://stackoverflow.com/questions/248362/how-do-i-build-a-datatemplate-in-c-sharp-code और http://stackoverflow.com/प्रश्न/5471405/create-datatemplate-in-code-behind लेकिन उनमें से कोई भी मेरे लिए काम नहीं कर रहा है। तो मैं 'डेटा टेम्पलेट' कैसे बना सकता हूं जो 'ग्रिडव्यू' में 'छवियों' प्रदान करता है? – daniel59

उत्तर

2

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

XAML

<Window x:Class="ListViewIcon.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:ListViewIcon" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <ResourceDictionary> 
      <DataTemplate x:Key="iconTemplate"> 
       <Image Source="{Binding Icon}" 
        Width="64" 
        Height="64"/> 
      </DataTemplate> 
     </ResourceDictionary> 
    </Window.Resources> 
    <Grid> 
     <ListView x:Name="myListView"></ListView> 

    </Grid> 
</Window> 

# सी

public class Column 
{ 
    public string Title { get; set; } 
    public string SourceField { get; set; } 
} 

public partial class MainWindow : Window 
{ 
    private BitmapImage LoadImage() 
    { 
     var img = new BitmapImage(); 
     img.BeginInit(); 
     img.UriSource = new Uri(@"D:\image.png", UriKind.Absolute); 
     img.CacheOption = BitmapCacheOption.OnLoad; 
     img.EndInit(); 

     return img; 
    } 

    public MainWindow() 
    { 
     InitializeComponent(); 

     GridView gridView = new GridView(); 
     this.myListView.View = gridView; 

     List<dynamic> myItems = new List<dynamic>(); 
     dynamic myItem; 
     IDictionary<string, object> myItemValues; 

     var image = LoadImage(); 

     // Populate the objects with dynamic columns 
     for (var i = 0; i < 100; i++) 
     { 
      myItem = new System.Dynamic.ExpandoObject(); 

      foreach (string column in new string[] { "Id", "Name", "Something" }) 
      { 
       myItemValues = (IDictionary<string, object>)myItem; 
       myItemValues[column] = "My value for " + column + " - " + i; 
      } 

      myItem.Icon = image; 

      myItems.Add(myItem); 
     } 

     // Assuming that all objects have same columns - using first item to determine the columns 
     List<Column> columns = new List<Column>(); 

     myItemValues = (IDictionary<string, object>)myItems[0]; 

     // Key is the column, value is the value 
     foreach (var pair in myItemValues) 
     { 
      Column column = new Column(); 

      column.Title = pair.Key; 
      column.SourceField = pair.Key; 

      columns.Add(column); 
     } 

     // Add the column definitions to the list view 
     gridView.Columns.Clear(); 

     foreach (var column in columns) 
     { 

      if (column.SourceField == "Icon") 
      { 
       gridView.Columns.Add(new GridViewColumn 
       { 
        Header = column.Title, 
        CellTemplate = FindResource("iconTemplate") as DataTemplate 
       }); 
      } 
      else 
      { 
       var binding = new Binding(column.SourceField); 
       gridView.Columns.Add(new GridViewColumn { Header = column.Title, DisplayMemberBinding = binding }); 
      } 


     } 

     // Add all items to the list 
     foreach (dynamic item in myItems) 
     { 
      this.myListView.Items.Add(item); 
     } 

    } 
} 

परिणाम

enter image description here

+1

धन्यवाद यह काम करता है! – daniel59

1

मुझे संदेह है कि आप अपने समाधान का उपयोग कर अपने दृष्टिकोण को सामान्य बनाने में सक्षम होंगे। यह पाठ-आधारित डेटा प्रकारों के लिए ठीक काम करता है जिसमें वैध ToString() प्रतिनिधित्व होता है, जो आपको उपयुक्त बनाता है। छवियों जैसे जटिल डेटाटाइप के साथ काम करने के लिए, आपको शायद Templates का उपयोग करना होगा, जैसा कि छायांकित मेटियोनेड है, जहां आपको प्रत्येक जटिल प्रकार के लिए अलग-अलग गुण सेट करना होगा। उदाहरण के लिए छवि के लिए यह आकार और स्रोत हो सकता है, बटन - पृष्ठभूमि रंग के लिए। एक विकल्प के रूप में, आप किसी प्रकार का टेम्पलेट फैक्ट्री बना सकते हैं और CellTemplateSelector लागू कर सकते हैं, जो आपको नस्लीय टेम्पलेट्स प्रदान करेगा, लेकिन जैसा कि आपने कहा है - यह एक बिल्कुल नया तरीका है।

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