private void DrawDataContext()
        {
            // draw line separator
            EditorGUILayout.LabelField("", lineStyle);

            EditorGUILayout.LabelField("DataContext Dictionary", GUILayout.Width(LabelWidth));

            using (var view = new EditorGUILayout.ScrollViewScope(dataContextScrollPos))
            {
                dataContextScrollPos = view.scrollPosition;

                // draw list header
                using (new EditorGUILayout.HorizontalScope())
                {
                    EditorGUILayout.LabelField("Index", GUILayout.Width(40));
                    EditorGUILayout.LabelField("Required Source Name", GUILayout.Width(200));
                    GUILayout.Space(SpaceWidth);

                    EditorGUILayout.LabelField("DataContext Count", GUILayout.Width(140));
                    EditorGUILayout.LabelField("IBinding Count", GUILayout.Width(100));
                    EditorGUILayout.LabelField("IsBound", GUILayout.Width(60));
                    GUILayout.Space(SpaceWidth);

                    EditorGUILayout.LabelField("Source Instance", GUILayout.Width(200));
                    GUILayout.Space(SpaceWidth);

                    EditorGUILayout.LabelField("DataContext Instance List", GUILayout.MinWidth(200));
                }

                int index = 0;
                foreach (var item in managerInstance.dataContextDictionary)
                {
                    var sourceName   = item.Key;
                    var list         = item.Value;
                    int bindingCount = managerInstance.GetBindingCountInGroup(sourceName);

                    using (new EditorGUILayout.HorizontalScope())
                    {
                        EditorGUILayout.LabelField(index.ToString(), GUILayout.Width(40));

                        // source name
                        EditorGUILayout.LabelField(item.Key, GUILayout.Width(200));
                        GUILayout.Space(SpaceWidth);

                        // DataContext info
                        object source = null;
                        managerInstance.sourceDictionary.TryGetValue(sourceName, out source);

                        EditorGUILayout.LabelField(string.Format("{0}", list.Count), GUILayout.Width(140));
                        EditorGUILayout.LabelField(string.Format("{0}", bindingCount), GUILayout.Width(100));
                        EditorGUILayout.LabelField(string.Format("{0}", source != null), GUILayout.Width(60));
                        GUILayout.Space(SpaceWidth);

                        // show select button
                        var unitySource = source as UnityEngine.Object;
                        if (unitySource != null)
                        {
                            if (GUILayout.Button(unitySource.name, GUILayout.Width(200)))
                            {
                                SelectObject(unitySource);
                            }
                        }
                        else
                        {
                            var objectName = "(null)";
                            if (source != null)
                            {
                                objectName = string.Format("(Object {0:X8})", source.GetHashCode());
                            }

                            EditorGUILayout.LabelField(objectName, GUILayout.Width(200));
                        }

                        GUILayout.Space(SpaceWidth);

                        // draw all dataContext
                        foreach (var dc in list)
                        {
                            var dcComponent = dc as DataContext;
                            if (dcComponent == null)
                            {
                                continue;
                            }

                            if (GUILayout.Button(dcComponent.name))
                            {
                                SelectObject(dcComponent);
                            }
                        }

                        GUILayout.FlexibleSpace();
                    }

                    GUILayout.Space(2f);

                    index++;
                }
            }
        }