我一直在尝试使用WPF MVVM项目中的动态列编辑DataGrid
。动态列将是相同的类型,即:decimal
。具有动态可编辑列的DataGrid
目标是收集部门数量不确定的部门总数。我试图在下面演示它。
Day Dept1 Dept2 Dept3... TotalOfDepartments CashTotal CreditTotal
=====================================================================
1 100 200 50 350 50 300
2 75 100 0 175 25 150
因此,有许多商店不确定部门和我的目标是收集一个月
我要让部,CashTotal & CreditTotal栏目编辑。我有我喜欢尝试几种方法:
- populate dynamic datagrid column and binding with editable using mVVm
- Populating a DataGrid with Dynamic Columns in a Silverlight Application using MVVM
- How do I bind a WPF DataGrid to a variable number of columns?
这是我从最后的办法最后一次尝试。具体如下:
型号:
public class DailyRevenues
{
public int ShopId { get; set; }
public int Day { get; set; }
public ObservableCollection<Department> DepartmentList { get; set; }
public DailyRevenues()
{
this.DepartmentList = new ObservableCollection<Department>();
}
}
public class Department
{
public string Name { get; set; }
private decimal total;
public decimal Total
{
get { return total; }
set { total = value; }
}
}
视图模型:
public class DataItemViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public DataItemViewModel()
{
this.MonthlyRevenues = new ObservableCollection<DailyRevenues>();
var d1 = new DailyRevenues() { ShopId = 1, Day = 1 };
d1.DepartmentList.Add(new Department() { Name = "Deapartment1", Total = 100 });
d1.DepartmentList.Add(new Department() { Name = "Deapartment2", Total = 200 });
var d2 = new DailyRevenues() { ShopId = 1, Day = 2 };
d2.DepartmentList.Add(new Department() { Name = "Deapartment1", Total = 75 });
d2.DepartmentList.Add(new Department() { Name = "Deapartment2", Total = 150 });
d2.DepartmentList.Add(new Department() { Name = "Deapartment3", Total = 100 });
this.MonthlyRevenues.Add(d1);
this.MonthlyRevenues.Add(d2);
}
private ObservableCollection<DailyRevenues> monthlyRevenues;
public ObservableCollection<DailyRevenues> MonthlyRevenues
{
get { return monthlyRevenues; }
set
{
if (monthlyRevenues != value)
{
monthlyRevenues = value;
OnPropertyChanged(nameof(MonthlyRevenues));
}
}
}
private void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
而XAML:
<DataGrid ItemsSource="{Binding MonthlyRevenues}" AutoGenerateColumns="False" >
<DataGrid.Columns>
<DataGridTextColumn Header="Day" Binding="{Binding Path=Day}" />
<DataGridTextColumn Header="{Binding Path=MonthlyRevenues[0].DepartmentList[0].Name}" Binding="{Binding Path=DepartmentList[0].Total, Mode=TwoWay}" />
<DataGridTextColumn Header="{Binding Path=DepartmentList[1].Name}" Binding="{Binding Path=DepartmentList[1].Total, Mode=TwoWay}" />
<DataGridTextColumn Header="Department Total"/>
<DataGridTextColumn Header="Cash Total" />
<DataGridTextColumn Header="Credit Total" />
</DataGrid.Columns>
</DataGrid>
不幸的是,最后一次尝试在XAML上使用索引器并不能帮助我处理动态列,而且我也找不到一种方法来以任何其他方式绑定它们。
更多信息:上面的datagrid(和数据演示)属于shop1,我想在窗口/用户控件上收集其部门的月收入。每个店铺在整个月都有相同的部门数量,但这并不意味着每个部门每天都应该有收入,可能为零。该部门可能会在任何一天关闭,因此不会在当天提高收入。 Shop2可能在同一个月有完全不同的部门,所以我不会在同一个屏幕上处理所有商店。
编辑1:有关添加场景的更多信息。
你见过/考虑过绑定DataTable吗?例如:https://stackoverflow.com/a/44206066/1506454 – ASh
@ASh,我怎样才能使它双向。我的意思是编辑是好的,但我怎么才能获得viewmodel的数据来做一些魔术呢? –
什么应该是双向的?用DataTable绑定单击DataGrid单元格应该允许编辑值。该cahnge将反映在dataTable单元格 – ASh