当前位置: 首页 > news >正文

使用Avalonia UI实现DataGrid

1.Avalonia中的DataGrid的使用

DataGrid 是客户端 UI 中一个非常重要的控件。在 Avalonia 中,DataGrid 是一个独立的包 Avalonia.Controls.DataGrid,因此需要单独通过 NuGet 安装。接下来,将介绍如何安装和使用 DataGrid 控件。

2.安装 DataGrid 包

要使用 DataGrid 控件,首先需要在 NuGet 中安装 Avalonia.Controls.DataGrid 包。只需在 NuGet 搜索框中输入 Avalonia.Controls.DataGrid,然后进行安装即可。

版本选择
在安装 Avalonia.Controls.DataGrid 包时,请确保其版本与 Avalonia 框架版本一致,否则可能导致安装失败。Avalonia 框架版本是您创建项目时选择的“Avalonia Version”。

注:Avalonia框架版本也可以在“依赖项→包”中查看

3.DataGrid的使用

App.axaml 文件中(或其他需要使用 DataGrid 的界面文件),需要引用 DataGrid 的样式文件。可以通过以下方式在界面中引入:

<!--下面样式文件二选一-->
<StyleInclude Source="avares://Avalonia.Controls.DataGrid/Themes/Fluent.xaml"/>
<StyleInclude Source="avares://Avalonia.Controls.DataGrid/Themes/Simple.xaml"/>

注:必须引用 DataGrid 的样式文件,否则 DataGrid 将无法正确显示。

4.代码实现

App.axaml文件

<Application xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"x:Class="datagridTest.App"RequestedThemeVariant="Default"><!-- "Default" ThemeVariant follows system theme variant. "Dark" or "Light" are other available options. --><Application.Styles><FluentTheme/><StyleInclude Source="avares://Avalonia.Controls.DataGrid/Themes/Fluent.xaml"/></Application.Styles>
</Application>

MainWindow.axaml文件

<Window xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:datagridTest"x:Class="datagridTest.MainWindow"x:DataType="local:MainWindow"Title="DataGrid Test" Width="400" Height="300"><StackPanel><!-- 显示 People 的数量,修改为显示“行数” --><TextBlock Text="{Binding PeopleCountText}" Margin="10" FontSize="16" /><!-- 按钮:点击后加载数据 --><Button Content="加载数据" Margin="10" Click="LoadDataButton_Click"/><!-- 按钮:点击后清除数据 --><Button Content="清除数据" Margin="10" Click="ClearDataButton_Click"/><!-- DataGrid --><DataGrid Name="DataGrid1" Margin="10" ItemsSource="{Binding People}"SelectionChanged="DataGrid_SelectionChanged"DoubleTapped="DataGrid_DoubleTapped" IsReadOnly="True"><DataGrid.Columns><DataGridTextColumn Header="ID" Binding="{Binding Id}" /><DataGridTextColumn Header="姓名" Binding="{Binding Name}" /><DataGridTextColumn Header="Age" Binding="{Binding Age}" /></DataGrid.Columns></DataGrid></StackPanel>
</Window>

MainWindow.axaml.cs文件

using Avalonia.Controls;
using Avalonia.Markup.Xaml;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using Avalonia.Interactivity;
using MsBox.Avalonia;namespace datagridTest
{public partial class MainWindow : Window, INotifyPropertyChanged{private List<Person> _people;public List<Person> People{get => _people ?? (_people = new List<Person>());set{_people = value;OnPropertyChanged();OnPropertyChanged(nameof(PeopleCountText));}}public string PeopleCountText => $"一共有{People.Count}行数据";public MainWindow(){InitializeComponent();DataContext = this;People = new List<Person>();}private void InitializeComponent(){AvaloniaXamlLoader.Load(this);System.Diagnostics.Debug.WriteLine("XAML loaded successfully");// 获取 DataGrid 控件的引用DataGrid1 = this.FindControl<DataGrid>("DataGrid1");}private void LoadDataButton_Click(object sender, RoutedEventArgs e){People = new List<Person>{new Person { Id = 1, Name = "张三(John Doe)", Age = 30 },new Person { Id = 2, Name = "李四(Jane Smith)", Age = 25 },new Person { Id = 3, Name = "王五(Sam Brown)", Age = 35 }};}private void ClearDataButton_Click(object sender, RoutedEventArgs e){People = new List<Person>();}private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e){if (DataGrid1 == null) return; // 检查 DataGrid1 是否为 nullvar selectedPerson = DataGrid1.SelectedItem as Person;if (selectedPerson != null){MsBox.Avalonia.MessageBoxManager.GetMessageBoxStandard("点击按钮(Button Clicked)", "您点击了: " + selectedPerson.Name).ShowWindowAsync();}}// 双击行时触发private void DataGrid_DoubleTapped(object sender, Avalonia.Interactivity.RoutedEventArgs e){if (DataGrid1 == null) return; // 检查 DataGrid1 是否为 nullvar selectedPerson = DataGrid1.SelectedItem as Person;if (selectedPerson != null){MsBox.Avalonia.MessageBoxManager.GetMessageBoxStandard("点击按钮(Button Clicked)", "您点击了: " + selectedPerson.Id).ShowWindowAsync();}}public event PropertyChangedEventHandler PropertyChanged;protected void OnPropertyChanged([CallerMemberName] string propertyName = null){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}}public class Person{public int Id { get; set; }public string Name { get; set; }public int Age { get; set; }}
}

代码解析:

1.INotifyPropertyChanged接口:
一定要实现INotifyPropertyChanged接口,否则界面datagrid数据无法展示。INotifyPropertyChanged 接口用于数据绑定通知,确保当数据变化时,界面能够自动更新。

2.数据绑定 (Binding):
在XAML中,DataGrid的ItemsSource属性通过Binding绑定到了People属性。这意味着DataGrid会显示People集合中的数据。

3.后台代码中的People属性:
在MainWindow类中,People是一个List<Person>类型的属性。它存储了要在界面上显示的数据。

4.初始化和数据加载:
MainWindow构造函数中,DataContext被设置为this(即MainWindow的实例),使得XAML中的绑定可以访问People属性。

4.数据加载和清除:
在LoadDataButton_Click方法中,当点击加载数据按钮时,People属性被设置为一个新的List<Person>,这会触发OnPropertyChanged()方法,从而更新界面。

5.DataGrid_SelectionChanged 事件
触发时机:该事件在 DataGrid 中的选中项发生变化时触发。例如,用户点击了某一行或选择了某个单元格时。

6.DataGrid_DoubleTapped 事件事件
触发时机:该事件在 DataGrid 中某行被双击时触发。即用户快速连续点击某一行时触发。

5.界面展示

源码地址:https://download.csdn.net/download/weixin_44643352/90323900

相关文章:

使用Avalonia UI实现DataGrid

1.Avalonia中的DataGrid的使用 DataGrid 是客户端 UI 中一个非常重要的控件。在 Avalonia 中&#xff0c;DataGrid 是一个独立的包 Avalonia.Controls.DataGrid&#xff0c;因此需要单独通过 NuGet 安装。接下来&#xff0c;将介绍如何安装和使用 DataGrid 控件。 2.安装 Dat…...

MySQL中的读锁与写锁:概念与作用深度剖析

MySQL中的读锁与写锁&#xff1a;概念与作用深度剖析 在MySQL数据库的并发控制机制中&#xff0c;读锁和写锁起着至关重要的作用。它们是确保数据在多用户环境下能够正确、安全地被访问和修改的关键工具。 一、读锁&#xff08;共享锁&#xff09;概念 读锁&#xff0c;也称为…...

Dest1ny漏洞库:用友 U8 Cloud ReleaseRepMngAction SQL 注入漏洞(CNVD-2024-33023)

大家好&#xff0c;今天是Dest1ny漏洞库的专题&#xff01;&#xff01; 会时不时发送新的漏洞资讯&#xff01;&#xff01; 大家多多关注&#xff0c;多多点赞&#xff01;&#xff01;&#xff01; 0x01 产品简介 用友U8 Cloud是用友推出的新一代云ERP&#xff0c;主要聚…...

python学opencv|读取图像(四十九)原理探究:使用cv2.bitwise()系列函数实现图像按位运算

【0】基础定义 按位与运算&#xff1a;两个等长度二进制数上下对齐&#xff0c;全1取1&#xff0c;其余取0。 按位或运算&#xff1a;两个等长度二进制数上下对齐&#xff0c;有1取1&#xff0c;其余取0。 按位异或运算&#xff1a; 两个等长度二进制数上下对齐&#xff0c;相…...

【面试】【编程范式总结】面向对象编程(OOP)、函数式编程(FP)和响应式编程(RP)

一、编程范式总结 编程范式是指开发软件时采用的一种方法论或思维方式&#xff0c;主要包括面向对象编程&#xff08;OOP&#xff09;、**函数式编程&#xff08;FP&#xff09;和响应式编程&#xff08;RP&#xff09;**等。这些范式的不同特性和适用场景&#xff0c;帮助开发…...

创建要素图层和表视图

操作方法: 下面按照步骤学习如何使用Make Feature Layer和Make Table View工具 1.在arcmap中打开活动地图文档 2.导入arcpy模块 3.设置工作空间 arcpy.env.workspace "<>" 4.使用try语句,使用Make Feature Layer工具创建内存副本 try:flayer arcpy.Ma…...

51单片机入门_01_单片机(MCU)概述(使用STC89C52芯片;使用到的硬件及课程安排)

文章目录 1. 什么是单片机1.1 微型计算机的组成1.2 微型计算机的应用形态1.3 单板微型计算机1.4 单片机(MCU)1.4.1 单片机内部结构1.4.2 单片机应用系统的组成 1.5 80C51单片机系列1.5.1 STC公司的51单片机1.5.1 STC公司单片机的命名规则 2. 单片机的特点及应用领域2.1 单片机的…...

万物皆有联系:驼鸟和布什

布什&#xff1f;一块布十块钱吗&#xff1f;不是&#xff0c;大家都知道&#xff0c;美国有两个总统&#xff0c;叫老布什和小布什&#xff0c;因为两个布什总统&#xff08;父子俩&#xff09;&#xff0c;大家就这么叫来着&#xff0c;目的是为了好区分。 布什总统的布什&a…...

【最后203篇系列】007 使用APS搭建本地定时任务

说明 最大的好处是方便。 其实所有任务的源头&#xff0c;应该都是通过定时的方式&#xff0c;在每个时隙发起轮询。当然在任务的后续传递中&#xff0c;可以通过CallBack或者WebHook的方式&#xff0c;以事件的形态进行。这样可以避免长任务执行的过程中进行等待和轮询。 总结…...

go gin配置air

一、依赖下载 安装最新&#xff0c;且在你工作区下进行安装&#xff0c;我的是D:/GO是我的工作区&#xff0c;所有项目都在目录下的src&#xff0c; go install github.com/air-verse/airlatest 如果出现类似报错&#xff1a; 将图中第三行 github.com/air-verse/air 替换最…...

Java定时任务实现方案(五)——时间轮

时间轮 这篇笔记&#xff0c;我们要来介绍实现Java定时任务的第五个方案&#xff0c;使用时间轮&#xff0c;以及该方案的优点和缺点。 ​ 时间轮是一种高效的定时任务调度算法&#xff0c;特别适用于大量定时任务的场景。时间轮的定时任务实现&#xff0c;可以使用DelayQueue…...

【事务管理】

目录 一. 介绍与操作二. Spring事务管理三. 事务四大特性 \quad 一. 介绍与操作 \quad \quad 二. Spring事务管理 \quad 推荐加在经常进行增删改的方法上 \quad 三. 事务四大特性 \quad ctrlaltt...

Highcharts 柱形图:深入解析与最佳实践

Highcharts 柱形图:深入解析与最佳实践 引言 Highcharts 是一个功能强大的图表库,它允许用户轻松地在网页上创建各种类型的图表。其中,柱形图因其直观的展示方式,在数据分析、业务报告等领域得到了广泛应用。本文将深入解析 Highcharts 柱形图,包括其基本用法、高级特性…...

js笔记(黑马程序员)

js&#xff08;day2&#xff09; 一、运算符 1.赋值运算符 运算符作用加法赋值-减法赋值*乘法复制/除法赋值%取余赋值 2.一元运算符 符号作用说明自增变量自身的值加1&#xff0c;如X--自减变量自身的值减1&#xff0c;如X-- 3.比较运算符 运算符作用>左边是否大于右…...

Mac m1,m2,m3芯片使用nvm安装node14报错

使用nvm安装了node 12/16/18都没有问题&#xff0c;到14就报错了。第一次看到这个报错有点懵&#xff0c;查询资料发现是Mac芯片的问题。 Issue上提供了两个方案&#xff1a; 1、为了在arm64的Mac上安装node 14&#xff0c;需要使用Rosseta&#xff0c;可以通过以下命令安装 …...

LeetCode:63. 不同路径 II

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;63. 不同路径 II 给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角&#xff08;即 grid[0][0]…...

安装zsh并美化

0 Zsh 是一种功能强大的 shell&#xff0c;通常用于替代默认的 Bash shell。它为命令行提供了更多的功能&#xff0c;例如自动补全、强大的模式匹配和主题支持等。 Oh My Zsh 是用于管理 Zsh 配置的框架。 powerlevel10k是样式&#xff0c;通过p10k configure脚本可以调节自己…...

读量子霸权18读后总结与感想兼导读

1. 基本信息 量子霸权 【美】加来道雄 著 中信出版集团股份有限公司,2024年4月出版 1.1. 读薄率 书籍总字数281千字&#xff0c;笔记总字数65977字。 读薄率65977281000≈23.48% 1.2. 读厚方向 量子宇宙 从掷骰子到阿尔法狗&#xff1a;趣谈概率 上帝掷骰子吗&#xf…...

统计学中的样本概率论中的样本

不知道当初谁想的把概率论和数理统计合并&#xff0c;作为一门课。这本身是可以合并&#xff0c;完整的一条线&#xff0c;看这里。但是&#xff0c;作为任课老师应该从整体上交代清楚&#xff0c;毕竟是两个学科&#xff0c;不同的学科合并必然会有各种不协调的问题。 举个最…...

HTML 符号详解

HTML 符号详解 引言 HTML(超文本标记语言)符号是HTML文档中用来表示特殊字符的标记。这些符号在日常网页设计和开发中扮演着重要角色,特别是在需要显示版权、商标、货币符号等特殊字符时。本文将详细介绍HTML符号的用法、类型以及如何在HTML文档中插入这些符号。 HTML符号…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...