BindToDataSet.axaml代码

<Window xmlns="https://github.com/avaloniaui"
        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"
        Height="516" Width="454"
        x:Class="AvaloniaUI.BindToDataSet"
        xmlns:sys="using:System.Data"
         xmlns:local="using:AvaloniaUI"
        Title="BindToDataSet">
    <Window.Resources>
        <local:ColumnValueConverter x:Key="Col" />
    </Window.Resources>
    
    <Grid RowDefinitions="*,auto,*">
        <!-- 上半 -->
        <Grid RowDefinitions="*,auto">
            <ListBox Name="lstProducts" x:DataType="sys:DataView"
                     Margin="5"
                     DisplayMemberBinding="{Binding Converter={StaticResource Col}, ConverterParameter=ModelName}">
            </ListBox>

            <StackPanel Grid.Row="1"
                        HorizontalAlignment="Right"
                        Orientation="Horizontal"
                        Margin="5 2 5 10">

                <Button Margin="2 0 0 0"
                        Padding="2"
                        Click="cmdDeleteProduct_Click">
                    Delete Selected
                </Button>

                <Button Margin="2 0 0 0"
                        Padding="2"
                        Click="cmdAddProduct_Click">
                    Add New
                </Button>

            </StackPanel>
        </Grid>

        <!-- 分割条 -->
        <GridSplitter Grid.Row="1"
                      HorizontalAlignment="Stretch"
                      Height="5"
                      ResizeDirection="Rows"
                      Background="Gray" />

        <!-- 下半 -->
        <Border Grid.Row="2"
                Padding="7"
                Margin="7"
                Background="LightSteelBlue" >

            <Grid DataContext="{Binding #lstProducts.SelectedItem}"
                  ColumnDefinitions="auto,*" RowDefinitions="auto,auto,auto,auto,*" x:DataType="sys:DataView">

                <TextBlock Margin="7" Text="Model Number:"/>
                <TextBox Margin="5"
                         Grid.Column="1"
                         Text="{Binding Converter={StaticResource Col}, ConverterParameter=ModelNumber}"/>

                <TextBlock Margin="7"
                           Grid.Row="1"
                           Text="Model Name:"/>
                <TextBox Margin="5"
                         Grid.Row="1"
                         Grid.Column="1"
                         Text="{Binding Converter={StaticResource Col}, ConverterParameter=ModelName}"/>

                <TextBlock Margin="7"
                           Grid.Row="2"
                           Text="Unit Cost:"/>
                <TextBox Margin="5"
                         Grid.Row="2"
                         Grid.Column="1"
                         Text="{Binding Converter={StaticResource Col}, ConverterParameter=UnitCost}"/>

                <TextBlock Margin="7 7 7 0"
                           Grid.Row="3"
                           Text="Description:"/>

                <ScrollViewer Grid.Row="4"
                         Grid.Column="0"
                         Grid.ColumnSpan="2">
                    <TextBox Margin="7"
                         AcceptsReturn="True"
                         TextWrapping="Wrap"
                         Text="{Binding Converter={StaticResource Col}, ConverterParameter=Description}" />
                </ScrollViewer>

            </Grid>
        </Border>
    </Grid>
</Window>

BindToDataSet.axaml.cs代码

using Avalonia;
using Avalonia.Controls;
using Avalonia.Data.Converters;
using Avalonia.Interactivity;
using AvaloniaUI.Demos.Book._19.StoreDatabase;
using System;
using System.Data;
using System.Globalization;

namespace AvaloniaUI;
public class ColumnValueConverter : IValueConverter
{
    public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
    {
        if (value is DataRowView rv && parameter is string col)
            return rv.Row[col]?.ToString();

        return null;
    }

    public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
    {
        if (value is string s && parameter is string col)
            return new ColumnSetRequest(col, s);

        return value!;
    }

    public record ColumnSetRequest(string ColumnName, string NewValue);
}
public partial class BindToDataSet : Window
{
    private DataSet? dataSet;     // 包含 Categories + Products
    private DataTable? products;  // Products 表

    public BindToDataSet()
    {
        InitializeComponent();

        // 读取整个 DataSet
        dataSet = new StoreDbDataSet().GetCategoriesAndProducts();

        if (dataSet == null)
            return;

        // 获取 Products 表
        products = dataSet.Tables["Products"];

        lstProducts.ItemsSource = products!.DefaultView;

        // 编辑写回
        lstProducts.PropertyChanged += (sender, e) =>
        {
            if (e.NewValue is ColumnValueConverter.ColumnSetRequest req &&
                lstProducts.SelectedItem is DataRowView rv)
            {
                rv.Row[req.ColumnName] = req.NewValue;
                RefreshView();
            }
        };
    }

    private void RefreshView()
    {
        lstProducts.ItemsSource = null;
        lstProducts.ItemsSource = products!.DefaultView;
    }

    private void cmdDeleteProduct_Click(object? sender, RoutedEventArgs e)
    {
        if (lstProducts.SelectedItem is DataRowView rv)
        {
            rv.Row.Delete();
            RefreshView();
        }
    }

    private void cmdAddProduct_Click(object? sender, RoutedEventArgs e)
    {
        if (products == null || dataSet == null)
            return;

        // 获取 Categories 表
        var categories = dataSet.Tables["Categories"];
        if (categories!.Rows.Count == 0)
            return;

        var validCategoryId = categories.Rows[0]["CategoryID"];

        var row = products.NewRow();

        row["ModelNumber"] = "00000";
        row["ModelName"] = "?";
        row["UnitCost"] = 0;
        row["Description"] = "?";

        row["CategoryID"] = validCategoryId;

        products.Rows.Add(row);

        RefreshView();

        lstProducts.SelectedIndex = lstProducts.ItemCount - 1;
    }
}

运行效果

image

 

posted on 2025-12-16 15:05  dalgleish  阅读(2)  评论(0)    收藏  举报