Wpf DataGrid動態添加列,行數據(二)

這是第二中方法,可直接綁定,我這裏只是做出了一種思路,並不是最完美。

這裏注意一下,因爲我裏面引用了MVVMLight,所以可能代碼不是複製過去就能用了的。

樣式也是,所以複製過去看不是我貼出來的界面這也不奇怪。代碼:

 <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>

        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"></RowDefinition>

            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>
        <StackPanel Orientation="Horizontal">
            <Button Content="新增列" Command="{Binding AddColumnCmd}" Margin="5"/>
            <Button Content="刪除列" Command="{Binding DeleteColumnCmd}" Margin="5"/>
            <Button Content="新增數據" Command="{Binding AddDataCmd}" Margin="5"/>
        </StackPanel>
        <!-- 自定義的DataGrid,使用到了一個依賴屬性DataSource -->
        <Controls:DyDataGrid HeadersVisibility="All" RowHeaderWidth="60" Grid.Row="1" MinColumnWidth="10"  DataSource="{Binding DyDGrid,Source={StaticResource Locator}}" SelectionUnit="CellOrRowHeader" SelectionMode="Extended"/>
        
    </Grid>

自定義控件DyDataGrid,就添加一個依賴屬性,賦值一個VM類DyDataGridViewModel,把DyDataGrid賦值給DyDataGridViewModel的DataGrid

public class DyDataGrid : DataGrid
    {
        public DyDataGrid()
            : base()
        {
            AutoGenerateColumns = false;
            CanUserAddRows = false;

            CanUserSortColumns = false;
        }

        // 這個控件的一個自定義屬性;
        private DyDataGridViewModel mDataSource;
        public DyDataGridViewModel DataSource
        {
            get { return mDataSource; }
            set
            {
                mDataSource = value;
            }
        }

        /// <summary>
        /// 定義了一個名爲DataSourc的控件依賴屬性;
        /// 這個依賴屬性用於顯示peopoleDataGrid的內容;
        /// </summary>
        public static readonly DependencyProperty DataSourceProperty =
                DependencyProperty.Register("DataSource", typeof(DyDataGridViewModel), typeof(DyDataGrid),
                new FrameworkPropertyMetadata(new PropertyChangedCallback(OnDataSourcePeopertyChanged)));

        private static void OnDataSourcePeopertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
        {
            DyDataGrid dyDataGrid = (DyDataGrid)obj;

            if (args.NewValue is DyDataGridViewModel)
            {
                if (dyDataGrid != null)
                {
                    DyDataGridViewModel peoplesViewModel = args.NewValue as DyDataGridViewModel;
                    peoplesViewModel.DDataGrid = dyDataGrid;
                   
                }
            }

        }
/// <summary>
    /// DyDataGrid的數據源,自動新增列等功能
    /// </summary>
    public class DyDataGridViewModel : ViewModelBase
    {
        /// <summary>
        /// 綁定的數據
        /// </summary>
        ObservableCollection<ExpandoObject> _Items = new ObservableCollection<ExpandoObject>();

        private DataGrid _DDataGrid;
        public DataGrid DDataGrid
        {
            get
            {
                return _DDataGrid;
            }
            set
            {
                if (_DDataGrid != null)
                {
                    _DDataGrid.ItemsSource = null;
                }
                _DDataGrid = value;
                Init();
            }
        }

        public ObservableCollection<ExpandoObject> Items
        {
            get { return _Items; }
            set
            {
                _Items = value;
                RaisePropertyChanged(() => Items);
            }
        }

        #region 方法
        /// <summary>
        /// 初始化
        /// </summary>
        public void Init()
        {
            Items.Clear();

            for (int i = 0; i < 5; i++)
            {
                dynamic item = new ExpandoObject();
                item.A = "Property A value - " + i.ToString();
                item.B = "Property B value - " + i.ToString();
                _Items.Add(item);
            }

            DDataGrid.Columns.Add(new DataGridTextColumn() { Header = "A", Binding = new Binding("A") });
            DDataGrid.Columns.Add(new DataGridTextColumn() { Header = "B", Binding = new Binding("B") });

            _DDataGrid.ItemsSource = Items;
        }

        public void AddData()
        {
            //dynamic item = new ExpandoObject();
            //item.A = "New Item - A";
            //item.B = "New Item - B";
            //item.NewColumn1 = "New Item - C";
            //Items.Add(item);
        }

        /// <summary>
        /// 添加列和列數據
        /// </summary>
        /// <param name="columnName">列名</param>
        /// <param name="columnName">顯示列名</param>
        /// <param name="vs">填充的列數據</param>
        public void AddColumn(string columnName, string Header, List<string> vs)
        {
            int i = 0;
            int count = vs.Count;
            //循環獲取行數據
            foreach (IDictionary<String, Object> item in Items)
            {
                //每行添加新列數據
                item.Add(columnName, vs[i]);
                i++;
                //添加完數據跳出
                if (i >= vs.Count) break;
            }

            //如果列數據多,則繼續添加
            for (; i < vs.Count; i++)
            {
                //可以這麼用 columnName就是傳進來的列名
                dynamic item = new ExpandoObject();
                item.columnName = vs[i];

                Items.Add(item);
            }

            //添加列
            DDataGrid.Columns.Add(new DataGridTextColumn()
            {
                Header = Header,
                Binding = new Binding(columnName)
            });

        }
        /// <summary>
        /// 刪除選中列
        /// </summary>
        public void DeleteColumn()
        {
            for (int i = 0; i < DDataGrid.SelectedCells.Count; i++)
            {
                //DataRowView Row = (DataRowView)DDataGrid.SelectedCells[i].Item;
                //string result = Row[DDataGrid.SelectedCells[i].Column.DisplayIndex].ToString();

                //string result = DDataGrid.SelectedCells[i].Column.DisplayIndex.ToString();

                DDataGrid.Columns.Remove(DDataGrid.SelectedCells[i].Column);
            }
        }

        #endregion
    }
public class W1ViewModel : ViewModelBase
    {
        /// <summary>
        /// Initializes a new instance of the MainViewModel class.  DataGrid
        /// </summary>
        public W1ViewModel(DyDataGridViewModel dyDataGridViewModel)
        {
            DyDGrid = dyDataGridViewModel;
        }
       
        public DyDataGridViewModel DyDGrid;

        public RelayCommand AddColumnCmd => new Lazy<RelayCommand>(() =>
           new RelayCommand(AddColumn)).Value;
        public RelayCommand AddDataCmd => new Lazy<RelayCommand>(() =>
            new RelayCommand(AddData)).Value;
        public RelayCommand DeleteColumnCmd => new Lazy<RelayCommand>(() =>
            new RelayCommand(DeleteColumn)).Value;

        private void AddData()
        {
            DyDGrid.AddData();
        }
        int newColumnIndex = 1;
        private void AddColumn()
        {
            string cName = "C" + newColumnIndex;
            List<string> vs = new List<string>();
            for (int i = 0; i < newColumnIndex; i++)
            {
                vs.Add("New Item - D" + i);
            }
            DyDGrid.AddColumn(cName, cName + "Show", vs);
            newColumnIndex++;
        }

        private void DeleteColumn()
        {
            DyDGrid.DeleteColumn();
        }
    }

 

DyDataGridViewModel封裝了對DataGrid的操作,同時也是DataGrid的數據源,可以使用綁定更新

效果如下:

 

 鏈接: https://pan.baidu.com/s/1eDRHMUzvpQyTjnmqoscpKw 提取碼: txs6 

想了想,還是把整個代碼發上來,哈哈,感覺你們應該喜歡。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章