2009-10-06 4 views
3

comment lier le dictionnaire à ListView et zone de texte?Dictionnaire de liaison WPF <chaîne, Liste <string> à listView, ListBox comment?

namespace Models 
{ 
    public class DynamicList 
    { 
    #region Constructor 

    public DynamicList() 
    { 
     _propDict = new Dictionary<string, object>(); 
     dynimicListProps = new List<DynimicListProperty>(); 
    } 
    #endregion Constructor 

    #region Fields 

    private Dictionary<string, object> _propDict; 
    private IList<DynimicListProperty> dynimicListProps; 
    #endregion Fields 

    #region Properties 
    public Dictionary<string, object> PropsDict 
    { 
     get { return _propDict; } 
     set { _propDict = value; } 
    } 
    public string TestString 
    { 
     get { return "Hello! It's works!"; } 
    } 
    #endregion Properties 

    #region Methods 
    public void CreateProperties(string[] arrLine) 
    { 
     for (int i = 0; i < arrLine.Count(); i++) 
     { 
      _propDict.Add(arrLine[i].Replace("\"",""), null); 
     } 
    } 

    #endregion Methods 
    } 

    public class DynimicListProperty 
    { 
    private IList<string> propertyNameValues = new List<string>(); 

    public IList<string> PropertyNameValues 
    { 
     get { return propertyNameValues; } 
     set { propertyNameValues = value; } 
    } 
    } 
} 

// now try to bind 

private Models.DynamicList _dynimicList; 
public Models.DynamicList _DynimicList 
     { 
      get { return _dynimicList; } 
     } 
CreateView() 
{ 
    _importView = new Views.ImportBomView(); 
       _importView.Grid1.DataContext = _DynimicList; 
       Binding bn = new Binding("Value.[2]"); 
       bn.Mode = BindingMode.OneWay; 
       bn.Source = _DynimicList.PropsDict.Keys; 
       _importView.tbFileName.SetBinding(TextBlock.TextProperty, bn); 
    /////////////////////////////////////////////////////////////////////////////   
//_importView.listView1.ItemsSource = (IEnumerable)_DynimicList.PropsDict["Value"]; 
////// it's works when Binding bn2 = new Binding("") but of course in 
///this emplementation I have the same data in all columns - so not good 
///////////////////////////////////////////////////////////////////////////////////// 

      // here I'll like to generate Columns and bind gvc.DisplayMemberBinding 
      // to dictionary _DynimicList.PropsDict[item] with Key=item 
      foreach (var item in _DynimicList.PropsDict.Keys) 
      { 
       Binding bn2 = new Binding("[3]"); 
       bn2.Source = (IEnumerable)_DynimicList.PropsDict[item]; 
       GridViewColumn gvc = new GridViewColumn(); 
       gvc.DisplayMemberBinding = bn2; 
       gvc.Header = item; 
       gvc.Width = 100; 
       _importView.gridView1.Columns.Add(gvc); 
      } 
      _importView.Show(); 
     } 

} 

Répondre

11

Vous pouvez écrire un DataTemplate pour KeyValuePair<string, List<string>> et le mettre dans la ItemsTemplate du ListView racine. Le ItemsSource de votre ListView serait votre dictionnaire. Dans ce datatemplate vous auriez un autre itemscontrol (comme une autre listview) où vous définissez le itemstemplate dans une zone de texte qui se lie à la chaîne. Vous pouvez également utiliser un seul TreeView pour tout en conjonction avec un datatemplate hiérarchique. Vous pouvez faire un TreeView regarder comme vous le souhaitez en utilisant des modèles.

<ListBox Name="listBox"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <ContentPresenter Content="{Binding Key}" Margin="0 0 4 0"/> 
       <ItemsControl ItemsSource="{Binding Value}"> 
        <ItemsControl.ItemsPanel> 
         <ItemsPanelTemplate> 
          <StackPanel Orientation="Horizontal" /> 
         </ItemsPanelTemplate> 
        </ItemsControl.ItemsPanel> 
        <ItemsControl.ItemContainerStyle> 
         <Style TargetType="ContentPresenter"> 
          <Setter Property="Margin" Value="0 0 2 0" /> 
         </Style> 
        </ItemsControl.ItemContainerStyle> 
       </ItemsControl> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Et dans le code derrière certaines données de l'échantillon:

var data = new Dictionary<string, List<string>> 
{ 
    {"1", new List<string> {"one", "two", "three", "four"}}, 
    {"2", new List<string> {"five", "six", "seven", "eight"}} 
}; 
this.listBox.ItemsSource = data; 
+0

pouvez-vous s'il vous plaît me donner un exemple de code - Je suis très novice en WPF – Janus

+0

Ajout d'un exemple à ma réponse. – bitbonk

+6

@Janus Veuillez marquer la question comme réponse. – Shimmy

Questions connexes