C# 如何使用键值对绑定动态生成的列?

C# 如何使用键值对绑定动态生成的列?,c#,wpf,data-binding,C#,Wpf,Data Binding,我正在用MVVM框架构建一个wpf应用程序。我有一组重复的数据,我正试图找出一种方法来整合这些数据。该数据集是为每个分配到工作的员工设计的,用于记录他们每月的工作天数。他们在数据库中使用的方法是将startdate和enddate与工作天数相关联。问题是,每个资源接收多个元组。我已经开发了我的datagrid,以根据所选项目的起始日期动态生成月份列。我想获取每个资源每月daysworked的值,并将其分配到标有该月的列。以下是一张供参考的图片: 我理解“select DaysWorked whe

我正在用MVVM框架构建一个wpf应用程序。我有一组重复的数据,我正试图找出一种方法来整合这些数据。该数据集是为每个分配到工作的员工设计的,用于记录他们每月的工作天数。他们在数据库中使用的方法是将startdate和enddate与工作天数相关联。问题是,每个资源接收多个元组。我已经开发了我的datagrid,以根据所选项目的起始日期动态生成月份列。我想获取每个资源每月daysworked的值,并将其分配到标有该月的列。以下是一张供参考的图片: 我理解“select DaysWorked where resourceId==resourceId&&StartDate==StartDate”中的逻辑,但我找不到任何资源可以帮助我将此关系绑定到xaml中不存在且在运行时生成的列。下面是我生成列的代码

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部分)添加到问题中吗;等一下。