仅使用 DataTable WinUI3 MVVM 中的数据填充 DataGrid

问题描述 投票:0回答:1

DataTable 使用数据库中的数据进行填充。

 var query = $"SELECT * FROM {databaseTable.Name}";
 OracleCommand oracleCommand = new OracleCommand(query, _connection);
 OracleDataAdapter oracleDataAdapter = new OracleDataAdapter(oracleCommand);
 DataTable data = new DataTable();
 oracleDataAdapter.Fill(data);
 return data;

我想通过 Itemssource 使用 DataTable 填充 DataGrid。我们不想指定任何对象(类)。我们只想用从数据表中获取的信息填充网格

<control:DataGrid x:Name="gridView1" Margin="5" ItemsSource="{Binding DataTable}" GridLinesVisibility="All" AlternatingRowBackground="DarkBlue">

目前我有一个 ListView,它向我显示我们从数据库中单独读出的所有表

 <ListView x:Name="listView" ItemsSource="{Binding DatabaseTables, Mode=TwoWay}" DisplayMemberPath="Name" SelectedItem="{Binding DatabaseTable, Mode=TwoWay}">

通过选择一个表,我们希望网格中显示所有条目以及数据表中的预期列

我尝试环顾四周,但找不到解决方案。

c# mvvm uwp-xaml winui-3
1个回答
0
投票

这应该有效:

MainPageViewModel.cs

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System.Collections.ObjectModel;
using System.Data;
using System.Threading.Tasks;

namespace DataTableExample;

public partial class  MainPageViewModel : ObservableObject
{
    [ObservableProperty]
    private ObservableCollection<object>? _items;

    [RelayCommand]
    private async Task LoadItems()
    {
        DataTable dataTable = await LoadItemsFromDataBase();

        ObservableCollection<object> items = new();

        foreach (DataRow row in dataTable.Rows)
        {
            items.Add(row.ItemArray);
        }

        Items = items;
    }

    private Task<DataTable> LoadItemsFromDataBase()
    {
        return Task.Run(() =>
        {
            DataTable dataTable = new();
            dataTable.Columns.Add("Id", typeof(int));
            dataTable.Columns.Add("Name", typeof(string));
            dataTable.Columns.Add("Price", typeof(decimal));
            dataTable.Rows.Add(1, "Product 1", 10.0);
            dataTable.Rows.Add(2, "Product 2", 20.0);
            dataTable.Rows.Add(3, "Product 3", 30.0);
            return dataTable;
        });
    }
}

MainPage.xaml.cs

using Microsoft.UI.Xaml.Controls;

namespace DataTableExample;
public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
    }

    private MainPageViewModel ViewModel => new();
}

主页.xaml

<Page
    x:Class="DataTableExample.MainPage"
    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:local="using:DataTableExample"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:toolkit="using:CommunityToolkit.WinUI.UI.Controls"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
    mc:Ignorable="d">

    <Grid RowDefinitions="Auto,*">
        <Button
            Grid.Row="0"
            Command="{x:Bind ViewModel.LoadItemsCommand}"
            Content="Load items" />
        <toolkit:DataGrid
            Grid.Row="1"
            AutoGenerateColumns="False"
            ItemsSource="{x:Bind ViewModel.Items, Mode=OneWay}">
            <toolkit:DataGrid.Columns>
                <toolkit:DataGridTextColumn
                    Binding="{Binding [0]}"
                    Header="ID" />
                <toolkit:DataGridTextColumn
                    Binding="{Binding [1]}"
                    Header="Name" />
                <toolkit:DataGridTextColumn
                    Binding="{Binding [2]}"
                    Header="Price" />
            </toolkit:DataGrid.Columns>
        </toolkit:DataGrid>
    </Grid>

</Page>

注意

我正在使用 CommunityToolkit.Mvvm NuGet 包进行 MVVM 设计。

© www.soinside.com 2019 - 2024. All rights reserved.