3

how to bind Dictionary to ListView and Text box?

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();
        }

}

1 Answer 1

10

You can write a datatemplate for KeyValuePair<string, List<string>> and put it in the ItemsTemplate of the root ListView. The ItemsSource of your ListView would be your dictionary. In this datatemplate you would have another itemscontrol (such as another listview) where you set the itemstemplate to a textbox that binds to the string. Alternatively you could use a single TreeView for everything in conjunction with hierarchical datatemplate. You can make a TreeView look however you want using templates.

<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>

And in the code behind some sample data:

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;
Sign up to request clarification or add additional context in comments.

3 Comments

could you please give me some code example - I'm very novice in WPF
Added an example to my answer.
ideas on how the code could be modified to allow for the individual values in the dictionary to be selected?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.