這是第二中方法,可直接綁定,我這裏只是作出了一種思路,並非最完美。spa
這裏注意一下,由於我裏面引用了MVVMLight,因此可能代碼不是複製過去就能用了的。code
樣式也是,因此複製過去看不是我貼出來的界面這也不奇怪。代碼:blog
<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的DataGridget
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的數據源,能夠使用綁定更新string
效果以下:it
連接: https://pan.baidu.com/s/1eDRHMUzvpQyTjnmqoscpKw 提取碼: txs6 io
想了想,仍是把整個代碼發上來,哈哈,感受大家應該喜歡。class