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;
}
}
运行效果

浙公网安备 33010602011771号