2010-03-03 6 views
2

사전 항목이 포함 된 목록이 있습니다. 즉, [0] = 사전 항목 => 항목 [0] = id, 항목 [1] = 이름, 항목 [2] = 금액입니다.ListView에 사전 바인딩 WPF

GridView에서 ListView 컨트롤에 표시해야합니다. 사전은 다를 수 있습니다.

UPDATE :

목록의 각 항목은 다음과 같습니다

[ "_id"] = "11212131" [ "제목"] = "이 제목은"[ "DateCreated"] = "some date"

사전 내의 항목이 다를 수 있습니다.

업데이트 2 : 나는 동적 GridView 컨트롤을 만든 다음 GridView 컨트롤에 열을 추가하려면 다음 코드를 사용하고

. 그것은 작동하지만 지금은 동일한 반복 열의 긴 수평선이 있습니다. 열 이름을 표시하고 해당 열에 속한 데이터를 표시해야합니다.

var gridview = new GridView(); 

      foreach (var o in objs) 
      { 
       var dic = o as Dictionary<String, Object>; 
       var enumerator = dic.GetEnumerator(); 
       while (enumerator.MoveNext()) 
       { 
        var current = enumerator.Current; 
        var gridViewColumn = new GridViewColumn(); 
        gridViewColumn.Header = current.Key; 
        var binding = new Binding(current.Key); 
        //binding.Source = current; 

        gridViewColumn.DisplayMemberBinding = binding; 

        gridview.Columns.Add(gridViewColumn); 

       } 

       // new row 

      } 

      lvCollections.View = gridview; 

UPDATE 3 :

내가 아주 가까이입니다. 작동하지만 반복되는 열이있는 긴 단일 행만 표시합니다.

var gridview = new GridView(); 


      foreach (var o in objs) 
      { 

       var dic = o as Dictionary<String, Object>; 
       var enumerator = dic.GetEnumerator(); 
       while (enumerator.MoveNext()) 
       {var gridViewColumn = new GridViewColumn(); 
        var current = enumerator.Current; 
        gridViewColumn.Header = current.Key; 
        var binding = new Binding(); 
        binding.Source = current; 
        binding.Path = new PropertyPath("Value"); 

        gridViewColumn.DisplayMemberBinding = binding; 
        gridview.Columns.Add(gridViewColumn); 

       } 


       // new row 

      } 

      lvCollections.ItemsSource = objs; 
      lvCollections.View = gridview; 
+0

나는이 아이디어를 분명히 이해하고 있지만 기본 데이터가 어떻게 제한되어 있는지 볼 수 있도록 수업을 게시 할 수 있습니까? – Charlie

+0

고정 된 클래스가 없습니다. 개체는 serialize 된 다음 사전 형식으로 deserialize됩니다. – azamsharp

답변

3

은 다음과 같이 당신의 GridView 열을 생성합니다 .. 당신의 DynamicDictionary 스키마에 명확하지 않다. 이 작업을하는 핵심은 바인딩 경로에있는 indxer sytax ('['와 ']')입니다.

+0

굉장! 나는 핵심 구문을 몰랐다. 감사합니다 백만 :) 매력처럼 작동합니다. – azamsharp

+0

XAML에서 인덱서를 어떻게 수행합니까? – azamsharp

+0

XAML에서 인덱서 구문을 사용하려면 바인딩 경로에서 []를 사용하십시오. 'Content = "{Binding [KeyGoesHere]}"', 또는 당신이 속성을 색인하기를 원한다면,'Content = "{Binding DictionaryProperty [KeyGoesHere]}"' –

3

당신의 ListView의 ItemTemplate을 작성하고 당신이 당신의 목록보기 내부에 키/값 두 쌍을 배치 할 경우는 다음과 같이 할 수 있습니다 :

<ListBox ItemsSource="{Binding Source={StaticResource YourDataObject}}"> 

<ListBox.ItemTemplate> 

    <DataTemplate> 

    <StackPanel Orientation="Horizontal"> 

    <Label Content="{Binding Key}" /> 

    <TextBlock xml:space="preserve"></TextBlock> 

    <Label Content="{Binding Value}" /> 

    </StackPanel> 

    </DataTemplate> 

</ListBox.ItemTemplate> 

</ListBox> 
+0

위의 코드는 "id"인 첫 번째 키와 "22121231"인 "id"의 값만 표시합니다. 이 작업을 동적으로 수행해야하는 것처럼 보입니다. – azamsharp

0

당신이 여기에서 필요로하는 것은 ObservableDictionary 작품입니다 ObservableCollection에 같은 당신을 위해 여기

http://social.msdn.microsoft.com/forums/en-US/wpf/thread/af80921b-8bf0-4763-bd30-1e01dfc6f132/는 대답은 몇 가지 팁을 보려면이 스레드를 확인 - http://drwpf.com/blog/2007/09/16/can-i-bind-my-itemscontrol-to-a-dictionary/

,691,363을210

코드 뒤에 UIElements를 만들고 VisualTree에 동적으로 추가하는 것이 더 좋은 아이디어는 아니라고 생각합니다. ObservableDictionary로 순수한 데이터 바인딩을 시도하십시오. ObservableDictionary는 내부적으로 GridView Datatemplates를 만들고 ListView를 적절한 열 순서로 유지합니다.

피하기 gridview.Columns.Add (gridViewColumn); 루프. 명확하게 행 수와 동일한 수의 열을 작성합니다. 당신의 사전 키에 특수 문자가 포함되지 않는

public void OnDataContextChanged(...) 
{ 
    var distinctKeys = (
    from dict in (List<Dictionary<string,object>>)DataContext 
    from key in dict.Keys 
    select key 
).Distinct(); 

    gridView.Columns.ReplaceWith(
    from key in distinctKeys 
    orderby key 
    select new GridViewColumn 
    { 
     Header = key, 
     DisplayMemberBinding = new Binding("[" + key + "]"), 
    }); 
} 

// The above code uses an extension method like this 
static void ReplaceWith<T>(this ObserableCollection<T> collection, IEnumerable<T> newItems) 
{ 
    collection.Clear(); 
    foreach(var item in newItems) 
    collection.Add(item); 
} 

이 작동합니다 : 당연히 나는

+0

업데이트 된 게시물을 참조하십시오! – azamsharp

+0

ObservableDictionary는 항목을 보거나 관측 할 의도가 없으므로 사용하지 않으려합니다. – azamsharp

+0

데이터 구조가 약간 복잡합니다. 나는 목록 objs가 있고 각 객체는 6-7 개의 키가있는 사전입니다. 각 키는 열의 이름입니다. – azamsharp