C# 如何使用键值对绑定动态生成的列?
我正在用MVVM框架构建一个wpf应用程序。我有一组重复的数据,我正试图找出一种方法来整合这些数据。该数据集是为每个分配到工作的员工设计的,用于记录他们每月的工作天数。他们在数据库中使用的方法是将startdate和enddate与工作天数相关联。问题是,每个资源接收多个元组。我已经开发了我的datagrid,以根据所选项目的起始日期动态生成月份列。我想获取每个资源每月daysworked的值,并将其分配到标有该月的列。以下是一张供参考的图片: 我理解“select DaysWorked where resourceId==resourceId&&StartDate==StartDate”中的逻辑,但我找不到任何资源可以帮助我将此关系绑定到xaml中不存在且在运行时生成的列。下面是我生成列的代码C# 如何使用键值对绑定动态生成的列?,c#,wpf,data-binding,C#,Wpf,Data Binding,我正在用MVVM框架构建一个wpf应用程序。我有一组重复的数据,我正试图找出一种方法来整合这些数据。该数据集是为每个分配到工作的员工设计的,用于记录他们每月的工作天数。他们在数据库中使用的方法是将startdate和enddate与工作天数相关联。问题是,每个资源接收多个元组。我已经开发了我的datagrid,以根据所选项目的起始日期动态生成月份列。我想获取每个资源每月daysworked的值,并将其分配到标有该月的列。以下是一张供参考的图片: 我理解“select DaysWorked whe
private void ResourceGrid_Headers(MainViewModel mvm)
{
string format = "MMMM yyyy";
List<SchedulesModel> allDates = mvm.ScheduleVM._Schedules.ToList();
List<SchedulesModel> dates = allDates.DistinctBy(x => x.StartDate).ToList();
int count = dates.Count() - 1;
DateTime start = dates[0].StartDate.GetValueOrDefault();
DateTime end = dates[count].EndDate.GetValueOrDefault();
List<String> dateArray = new List<string>();
dates.OrderBy(x => x.StartDate);
foreach(var item in dates)
{
dateArray.Add(item.StartDate.GetValueOrDefault().ToString(format));
}
foreach(var item in mvm.ScheduleVM._Schedules)
{
//??
}
//add array to columns
for (int i = 0; i < dateArray.Count; i++)
{
DataGridTextColumn c = new DataGridTextColumn();
System.Windows.Data.Binding b = new System.Windows.Data.Binding(mvm.ScheduleVM._Schedules.
Select(x => x.DaysPerMonth).ToString());
c.Binding = b;
c.Header = dateArray[i];
resourceGrid.Columns.Add(c);
}
}
private void ResourceGrid_头文件(MainViewModel mvm)
{
字符串格式=“MMMM-yyyy”;
List allDates=mvm.ScheduleVM.u Schedules.ToList();
List dates=allDates.DistinctBy(x=>x.StartDate.ToList();
int count=dates.count()-1;
DateTime开始=日期[0]。开始日期。GetValueOrDefault();
DateTime end=日期[count].EndDate.GetValueOrDefault();
List dateArray=新列表();
dates.OrderBy(x=>x.StartDate);
foreach(日期中的var项目)
{
dateArray.Add(item.StartDate.GetValueOrDefault().ToString(格式));
}
foreach(mvm.ScheduleVM.\u调度中的变量项)
{
//??
}
//向列添加数组
for(int i=0;ix.DaysPerMonth.ToString());
c、 绑定=b;
c、 Header=dateArray[i];
resourceGrid.Columns.Add(c);
}
}
以及数据网格的xaml
<DataGrid x:Name="resourceGrid" Grid.Column="1" Grid.Row="5" Grid.ColumnSpan="6" Grid.RowSpan="2" ItemsSource="{Binding Path=ScheduleVM._Schedules}" BorderBrush="#FF4480A8" BorderThickness="3,3,3,3" CanUserReorderColumns="False" ScrollViewer.CanContentScroll="True" ScrollViewer.HorizontalScrollBarVisibility="Visible" Padding="0" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridComboBoxColumn Header="Resource" DisplayMemberPath="ResourceName" SelectedValuePath="ResourceID" SelectedValueBinding="{Binding ResourceID}">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding Path=DataContext.ResourcesVM._Resources, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/>
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding Path=DataContext.ResourcesVM._Resources, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
<DataGridComboBoxColumn Header="Role" DisplayMemberPath="RoleName" SelectedValuePath="RoleID" SelectedValueBinding="{Binding RoleID}">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding Path=DataContext.RolesVM._Roles, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/>
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding Path=DataContext.RolesVM._Roles, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
<DataGridTextColumn Header="Project Days" Binding="{Binding DaysPerMonth}"/>
我还想提一下,我不确定使用2个参数使用哪种集合。我想坚持使用ObservaleCollection,但我怀疑这是可能的,因为月份列不在任何模型中。据我所知,这本字典只需要一把钥匙。所以我的问题是:
如何将每个列绑定到一个基于resourceid和startdate的值
非常感谢,,
Dan有什么原因不能将其转换为更可用的模型进行显示?将当前模型(用于从数据源读取的模型)转换为满足显示需要的模型。将该逻辑放在别处,而不是viewmodel中。如果您计划在视图中进行更改,那么我肯定会使用ObservableCollection&INotifyPropertyChanged。相反,我的意见是无论如何都要使用它,正如我一直注意到的那样——一旦开发了第一个应用程序(这有助于用户/业务),就会进行进一步的开发,以提高用户的交互性。我无法为它建立模型的原因是,月份列将根据加载的项目而变化。所以我没有办法为每个可能的月份设置属性。啊,我明白了。你能把你当前的xaml绑定代码(最底层的datagrid部分)添加到问题中吗;请稍等。有什么原因不能将其转换为更可用的模型进行显示吗?将当前模型(用于从数据源读取的模型)转换为满足显示需要的模型。将该逻辑放在别处,而不是viewmodel中。如果您计划在视图中进行更改,那么我肯定会使用ObservableCollection&INotifyPropertyChanged。相反,我的意见是无论如何都要使用它,正如我一直注意到的那样——一旦开发了第一个应用程序(这有助于用户/业务),就会进行进一步的开发,以提高用户的交互性。我无法为它建立模型的原因是,月份列将根据加载的项目而变化。所以我没有办法为每个可能的月份设置属性。啊,我明白了。你能把你当前的xaml绑定代码(最底层的datagrid部分)添加到问题中吗;等一下。