gpt4 book ai didi

c# - 将模型类的列表/集合/IEnumerable 绑定(bind)到数据网格并选择列

转载 作者:行者123 更新时间:2023-12-03 11:02:00 26 4
gpt4 key购买 nike

我似乎无法通过搜索找到这个答案,也无法将其他示例中的点连接到我的场景。

使用 MVVM 模式:

  • 如何通过 View 中的 ViewModel 将我的模型类绑定(bind)到列表框/数据网格?
  • 如何挑选我想要显示的列?
  • 问题 2 跟进:我可以通过 Visual Studio UI 属性进行选择,如果可以,如何选择?
  • 如果使用 XAML 完成,我的模型/ View 模型类是否有自动完成功能?
  • 使用 Observable Collection,正确的实现方式是什么?
  • 什么是“首选”XAML 控件(数据网格?、列表框?等)

  • 我已将示例简化为:
    型号类:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Threading.Tasks;


    namespace TestListBinding.Models
    {
    public class ProjectModel
    {
    public string Id { get; set; }
    public string ProjectTitle { get; set; }
    public string ProjectDetails { get; set; }
    }
    }

    View 模型类:
    using System;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.Text;
    using System.Threading.Tasks;
    using TestListBinding.Models;

    namespace TestListBinding.ViewModels
    {
    public class ProjectViewModel
    {
    private ProjectModel _project;
    private ObservableCollection<ProjectModel> _projects;

    public ProjectViewModel()
    {
    _projects = new ObservableCollection<ProjectModel>();
    var proj = new ProjectModel();
    for (int i = 1; i <= 3; i++)
    {
    proj.Id = "ID" + i.ToString();
    proj.ProjectTitle = "Project " + i.ToString();
    proj.ProjectDetails = "Details about this: " + i.ToString();
    _projects.Add(proj);
    proj = new ProjectModel();
    }
    }

    public IEnumerable<ProjectModel> Projects
    {
    get { return _projects; }
    }
    }
    }

    查看部分:

    我知道我需要一个 DataContext为 View 。许多示例显示它是在代码隐藏中设置的(见下文),并且一些示例引用了列表框的“StaticResource”。我还没有找到一种通过 UI 设置绑定(bind)的方法,就像我的代码设置方式一样。

    主窗口.cs:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using TestListBinding.ViewModels;

    namespace TestListBinding
    {
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
    public MainWindow()
    {
    InitializeComponent();
    DataContext = new ProjectViewModel();//is this correct, or is there an alternative method via XAML/control properties?
    }
    }
    }

    XAML(通过代码或 UI)您能否帮我完成数据网格列/绑定(bind):
    根据@EdPlunkett 更新
        <Window x:Class="TestListBinding.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:TestListBinding"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">
    <Grid>
    <DataGrid HorizontalAlignment="Left" Height="239" Margin="42,32,0,0" VerticalAlignment="Top" Width="435" ItemsSource="{Binding Projects}">
    <DataGrid.Columns>
    <DataGridTextColumn Header="Project Title" Binding="{Binding ProjectTitle}"/>
    <DataGridTextColumn Header="Project Details" Binding="{Binding ProjectDetails}"/>
    </DataGrid.Columns>

    </DataGrid>

    </Grid>
    </Window>

    这会产生一个带有额外列的奇怪布局:
    Extra Columns

    最佳答案

    这在您的窗口构造函数中是正确的:

    DataContext = new ProjectViewModel();
    这应该会向您显示网格中的一些内容:
    <DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding Id}" Header="ID" />
    <DataGridTextColumn Binding="{Binding ProjectTitle}" Header="Project Title" />
    <DataGridTextColumn Binding="{Binding ProjectDetails}" Header="Project Details" />
    </DataGrid.Columns>
    WPF 人员通常不使用设计器/属性 Pane 的东西。这不是很好,十多年来也没有改善。在这种情况下,您在自动完成方面也不走运。
    首选控制?取决于你想要什么:如果你想要每行多列,请使用 DataGrid 或 ListView。如果您希望每行显示一个值,或者每行显示某种漂亮的模板 UI,请使用 ListBox。
    快速列表框:
    <ListBox
    ItemsSource=“{Binding Projects}”
    DisplayMemberPath=“ProjectTitle”
    />

    关于c# - 将模型类的列表/集合/IEnumerable 绑定(bind)到数据网格并选择列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56229600/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com