标签:selected useradd 一个 tco return ddr ring cal index
这是第二中方法,可直接绑定,我这里只是做出了一种思路,并不是最完美。
这里注意一下,因为我里面引用了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>
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;
}
}
///
/// 定义了一个名为DataSourc的控件依赖属性;
/// 这个依赖属性用于显示peopoleDataGrid的内容;
///
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;
}
}
}
///
/// DyDataGrid的数据源,自动新增列等功能
///
public class DyDataGridViewModel : ViewModelBase
{
///
/// 绑定的数据
///
ObservableCollection _Items = new ObservableCollection();
private DataGrid _DDataGrid;
public DataGrid DDataGrid
{
get
{
return _DDataGrid;
}
set
{
if (_DDataGrid != null)
{
_DDataGrid.ItemsSource = null;
}
_DDataGrid = value;
Init();
}
}
public ObservableCollection Items
{
get { return _Items; }
set
{
_Items = value;
RaisePropertyChanged(() => Items);
}
}
#region 方法
///
/// 初始化
///
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);
}
///
/// 添加列和列数据
///
/// 列名
/// 显示列名
/// 填充的列数据
public void AddColumn(string columnName, string Header, Liststring> vs)
{
int i = 0;
int count = vs.Count;
//循环获取行数据
foreach (IDictionary item in Items)
{
//每行添加新列数据
item.Add(columnName, vs[i]);
i++;
//添加完数据跳出
if (i >= vs.Count) break;
}
//如果列数据多,则继续添加
for (; i )
{
//可以这么用 columnName就是传进来的列名
dynamic item = new ExpandoObject();
item.columnName = vs[i];
Items.Add(item);
}
//添加列
DDataGrid.Columns.Add(new DataGridTextColumn()
{
Header = Header,
Binding = new Binding(columnName)
});
}
///
/// 删除选中列
///
public void DeleteColumn()
{
for (int i = 0; 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
{
///
/// Initializes a new instance of the MainViewModel class. DataGrid
///
public W1ViewModel(DyDataGridViewModel dyDataGridViewModel)
{
DyDGrid = dyDataGridViewModel;
}
public DyDataGridViewModel DyDGrid;
public RelayCommand AddColumnCmd => new Lazy(() =>
new RelayCommand(AddColumn)).Value;
public RelayCommand AddDataCmd => new Lazy(() =>
new RelayCommand(AddData)).Value;
public RelayCommand DeleteColumnCmd => new Lazy(() =>
new RelayCommand(DeleteColumn)).Value;
private void AddData()
{
DyDGrid.AddData();
}
int newColumnIndex = 1;
private void AddColumn()
{
string cName = "C" + newColumnIndex;
Liststring> vs = new Liststring>();
for (int i = 0; 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
想了想,还是把整个代码发上来,哈哈,感觉你们应该喜欢。
Wpf DataGrid动态添加列,行数据(二)
标签:selected useradd 一个 tco return ddr ring cal index
原文地址:https://www.cnblogs.com/lsgsanxiao/p/11559445.html