Silverlight GridView(DataGrid)嵌套多張表

可以通過設置DataGrid的HierarchyChildTemplate來實現表的主從嵌套,不過這裏設置完成後所有嵌套的表的結構都是一樣了,但是我需要不一樣的結構,由一下代碼完成。

注1:DataGrid的嵌套是直接點擊後下拉出來的,平時看不出有嵌套的情況。但是我想在要那種樹狀結構,所以這裏直接用了RAD第三方控件的插件,RadGridView,他們都能實現,只是顯示的效果有點不一樣。

注2:DLL


XAML:

<telerik:RadGridView x:Name="radTree" 
                         ShowGroupPanel="False"
                         CanUserFreezeColumns="False" 
                         GridLinesVisibility="Both" 
                         IsReadOnly="True" 
                         AutoGenerateColumns="False"
                         IsFilteringAllowed="False"
                         RowIndicatorVisibility="Collapsed" Margin="0,2">
            <telerik:RadGridView.ChildTableDefinitions>
                <telerik:GridViewTableDefinition/>
            </telerik:RadGridView.ChildTableDefinitions>
            <telerik:RadGridView.Columns>
                <telerik:GridViewDataColumn Header="名稱" DataMemberBinding="{Binding Name}"  MinWidth="100"/>
                <telerik:GridViewDataColumn Header="開始時間" DataMemberBinding="{Binding StartTime}" MinWidth="120" />
                <telerik:GridViewDataColumn Header="結束時間" DataMemberBinding="{Binding EndTime}" MinWidth="120" />
            </telerik:RadGridView.Columns>
            <telerik:RadGridView.HierarchyChildTemplate>
                <DataTemplate>
                    <telerik:RadGridView  ItemsSource="{Binding Items}" 
                                    ShowGroupPanel="False"
                                    CanUserFreezeColumns="False" 
                                    GridLinesVisibility="Horizontal" 
                                    IsReadOnly="True" 
                                    AutoGenerateColumns="False"
                                    IsFilteringAllowed="False"  
                                    ShowColumnHeaders="False" BorderThickness="0">
                        <telerik:RadGridView.ChildTableDefinitions>
                            <telerik:GridViewTableDefinition/>
                        </telerik:RadGridView.ChildTableDefinitions>
                        <telerik:RadGridView.Columns>
                            <telerik:GridViewDataColumn  DataMemberBinding="{Binding Name}" MinWidth="100"/>
                        </telerik:RadGridView.Columns>
                        <telerik:RadGridView.HierarchyChildTemplate>
                            <DataTemplate>
                                <classes:MyDataGrid DataSources="{Binding Datas}" Visibility="Collapsed"/>
                            </DataTemplate>
                        </telerik:RadGridView.HierarchyChildTemplate>
                    </telerik:RadGridView>
                </DataTemplate>
            </telerik:RadGridView.HierarchyChildTemplate>
        </telerik:RadGridView>

後臺:

 public partial class MainPage
    {
        public MainPage()
        {
            InitializeComponent();
            Init();
        }

        private void Init()
        {
            var fruit = new List<string> { "蘋果", "橘子", "香蕉" };
            var municipality = new List<string> { "北京", "天津", "上海", "重慶" };
            var province = new List<string> { "黑龍江", "吉林", "遼寧" };
            var leafItem1 = new LeafItem { Name = "水果", Datas = CreateNewDatas(fruit) };
            var leafItem2 = new LeafItem { Name = "直轄市", Datas = CreateNewDatas(municipality) };
            var leafItem3 = new LeafItem { Name = "省份", Datas = CreateNewDatas(province) };
            var leaf1 = new Leaf { Name = "總結點1", StartTime = "2013-06-01", EndTime = "2013-06-02", Items = new List<LeafItem> { leafItem1 } };
            var leaf2 = new Leaf { Name = "總結點2", StartTime = "2013-06-02", EndTime = "2013-06-03", Items = new List<LeafItem> { leafItem2, leafItem3 } };
            radTree.ItemsSource = new List<Leaf> { leaf1, leaf2 };
        }

        private static List<Dictionary<string, string>> CreateNewDatas(List<string> list)
        {
            var random = new Random();
            var datas = new List<Dictionary<string, string>>();
            var count = random.Next(10);
            for (var i = 0; i < count; i++)
            {
                datas.Add(list.ToDictionary(str => str, str => random.Next(50).ToString(CultureInfo.InvariantCulture)));
            }
            return datas;
        }
    }



這裏爲了實現不同的從屬表結構,所以自定義了一個控件,繼承自DataGrid。這裏用到了上一篇裏面DataGrid 綁定 字典集合

 public class MyDataGrid : DataGrid
    {
        #region 數據值

        public static readonly DependencyProperty DataSourcesProperty =
        DependencyProperty.Register("DataSources", typeof(List<Dictionary<string, string>>), typeof(MyDataGrid), new PropertyMetadata(null));
        public List<Dictionary<string, string>> DataSources
        {
            get { return (List<Dictionary<string, string>>)GetValue(DataSourcesProperty); }
            set { SetValue(DataSourcesProperty, value); }
        }

        #endregion

        public MyDataGrid()
        {
            DefaultStyleKey = typeof(DataGrid);
            Loaded += MyDataGrid_Loaded;
        }

        void MyDataGrid_Loaded(object sender, RoutedEventArgs e)
        {
            if (DataSources == null || DataSources.Count == 0) return;
            var first = DataSources.First();
            foreach (var node in first)
            {
                Columns.Add(new DataGridTextColumn { Header = node.Key, Binding = new Binding(string.Format("[{0}]", node.Key)) });
            }
            AutoGenerateColumns = false;
            ItemsSource = DataSources;
            Visibility = Visibility.Visible;
        }
    }

再設置一個用於綁定的類

 public class LeafItem
    {
        public string Name { get; set; }
        public List<Dictionary<string, string>> Datas { get; set; }
        public LeafItem()
        {
            Datas = new List<Dictionary<string, string>>();
        }
    }

    public class Leaf
    {
        public string Name { get; set; }
        public string StartTime { get; set; }
        public string EndTime { get; set; }
        public List<LeafItem> Items { get; set; }
        public Leaf()
        {
            Items = new List<LeafItem>();
        }
    }




Demo:http://download.csdn.net/detail/wushang923/5507061

發佈了40 篇原創文章 · 獲贊 5 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章