如何将DataGrid绑定到WPF和MVVM中动态可变的数据和用户输入



我是WPF的新手,我想在我的usercontrol中显示类似的东西:示例图像

我从不同来源获取数据:

列:

id:始终存在

问题1 ... n:我有一个像这样的XML文件

我想从中获得问题的列。可能有很多问题。

等级:始终出现

行:

每一行应仅包含文本框(有些仅适用于用户)。

ID列中的数据来自文件。

问题的值是用户输入的。

将计算成等级的数据。

问题的输入值和等级的计算值与ID有关。

我尝试通过使用 datagrid 并为问题列设置DataGridTemplateColumn来实现此目标,但并未真正成功。我认为在这种情况下,这将是正确的控制,但是我真的无法弄清楚如何设置。

我考虑通过根据数据添加标签和文本框来手动构建此"表"。但是然后我的ViewModel应该知道违反MVVM的视图。

谢谢。

编辑:谢谢,@ivan Furdek到目前为止提供了帮助!我现在必须显示每个文本框和列的问题,并可以编辑它们。但是我的收藏将不会更新-.-因此我的 List<double> PointsPerProblems停留在Intialized值

这是我的XAML:

<ItemsControl ItemsSource="{Binding PointsPerProblems, Mode=TwoWay, 
             UpdateSourceTrigger=PropertyChanged}">                                            
         <ItemsControl.ItemsPanel>
             <ItemsPanelTemplate>
                 <StackPanel Orientation="Horizontal"/>
             </ItemsPanelTemplate>
         </ItemsControl.ItemsPanel>
         <ItemsControl.ItemTemplate>
             <DataTemplate>
                 <Border Width="70">
                     <TextBox Text="{Binding Path=., Mode=TwoWay,
                      UpdateSourceTrigger=PropertyChanged}"
                      TextAlignment="Center"/>
                 </Border>
             </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

我的模型:

public class GradingModel
{
    public string MatriculationNumber { get; set; }
    public List<double> PointsPerProblems { get; set; }
    public double Grade { get; set; }
    public double TotalScore { get; set; }
}

和我的ViewModel的特定部分:

public ObservableCollection<GradingModel> Gradings
    {
        get
        {
            return this.gradings;
        }
        set
        {
            this.gradings = value;
            this.OnPropertyChanged(nameof(this.Gradings));
        }
    }
public List<string> ProblemList
    {
        get
        {
            return this.problemList;
        }
        set
        {
            this.problemList = value;
            this.OnPropertyChanged(nameof(this.ProblemList));
        }
    }
private void GetGradingForm()
    {
        ExamRatingDTO examRatingModel = new ExamRatingDTO();
        List<StudentDTO> students = new List<StudentDTO>();
        this.messageBoxService.ShowInfoMessage(
            "Please Select a xml-File containing the Exam Ratings.",
            "Select a Exam Rating File.");
        try
        {
           examRatingModel = this.fileDialogService.OpenLoadFileDialog<ExamRatingDTO>();
        }
        catch (InvalidOperationException ex)
        {
            this.messageBoxService.ShowErrorMessage("Please select a correct Exam Rating File.", ex);
        }
        this.messageBoxService.ShowInfoMessage(
            "Please Select a xml-File containing the Students Information.",
            "Select a Student Information File.");
        try
        {
            students = this.fileDialogService.OpenLoadFileDialog<List<StudentDTO>>();
        }
        catch (InvalidOperationException ex)
        {
            this.messageBoxService.ShowErrorMessage("Please select a correct Students File.", ex);
        }
        foreach (var student in students)
        {
            this.Gradings.Add(new GradingModel()
            {
                MatriculationNumber = student.MatriculationNumber.ToString(),
                PointsPerProblems = new List<double>(),
                Grade = 0.0,
                TotalScore = 0.0
            });
        }
        List<string> tmpProblemList = new List<string>();
        foreach (var problem in examRatingModel.PointsPerProblems)
        {
            tmpProblemList.Add(problem.ProblemName);
        }
        foreach (var grading in this.Gradings)
        {
            for (int i = 0; i < tmpProblemList.Count; i++)
            {
                grading.PointsPerProblems.Add(0.0);
            }
        }
        this.ProblemList = tmpProblemList;
    }

编辑

OK在答案的第二个编辑中找到了最后一个问题的解决方案

wpf:如何使用动态列编辑进行数据绑定?

您需要将XML解析到

之类的对象列表中
    public class Student 
    { 
        public int Id { get; set; } 
        public List<decimal> ProblemScores { get; set; } 
        public DecimalGrade
        { 
            get
            {
               return ProblemScores.Average();
            }
        } 

之后,我建议您遵循此方法获取所需的显示:https://blogs.msmvps.com/deborahk/populating-a-a-datagrid-with-with-dynamic-columns-in-a-a-a-a-a-silverlight-silverlight-sapplication-using-using-using-using-using--mvvm/

确保使用两种方式绑定,并且UpdateSourceTrigger = PropertyChanged这样,因此更改就可以播种回列表。

ID和得分的列应设置为true。

相关内容

  • 没有找到相关文章

最新更新