惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

M
MIT News - Artificial intelligence
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
Apple Machine Learning Research
Apple Machine Learning Research
Last Week in AI
Last Week in AI
S
SegmentFault 最新的问题
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
美团技术团队
人人都是产品经理
人人都是产品经理
WordPress大学
WordPress大学
The Cloudflare Blog
IT之家
IT之家
雷峰网
雷峰网
小众软件
小众软件
博客园 - 叶小钗
博客园 - 聂微东
爱范儿
爱范儿
博客园 - 司徒正美
博客园 - 三生石上(FineUI控件)
V
Visual Studio Blog
博客园 - 【当耐特】
V
V2EX
博客园_首页
T
Tailwind CSS Blog

博客园 - 丹心石

数据字节位改变 锁定鼠标光标到指定屏幕 WPF 访问WebAPI Avalonia 避坑经验总结 Avalonia 窗口与配置 Avalonia 程序打包成Linux平台的运行程序 数据处理与转换 信号与槽 Qt 串口通信 Avalonia 设计时DataContext数据山下文和WPF设计时DataContext数据上下文 Avalonia Ursa 使用 Avalonia-消息对话框 Avalonia-数据绑定 Avalonia-样式 阿里图标库iconfont 在Avalonia 中的使用 Avlonia 自定义控件 Sqlite EF For ConsoleCore Sqlite EF CodeFirst For WPF win10 环境变量不可编辑 WCF-双工通讯 MahMetro 框架学习 由于缺少调试目标“xxx”Visual Studio 无法开始调试。或者响应地设置outputpath和AssemblyName 属性 WPF 应用程序本地化-资源文件方式 FastReport 行高设置实现行高随内容自动变化
Avalonia MVVM
丹心石 · 2026-02-02 · via 博客园 - 丹心石

Avalonia MVVM 框架

1.视图模型

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System.Collections.ObjectModel;

namespace AvaloniaMVVMDemo.ViewModels
{
    public partial class MainViewModel:ObservableObject
    {
        [ObservableProperty]
        private string _title = "Avalonia MVVM Demo"; //用标记属性[ObservableProperty],默认生成对应的属性,如Title
        [ObservableProperty]
        private string _inputText = string.Empty;
        [ObservableProperty]
        private ObservableCollection<string> _items = new ObservableCollection<string>();
        [RelayCommand]
        private void AddItem()
        {
            if (!string.IsNullOrEmpty(InputText))  //这个InputText 即为框架默认生成的属性
            {
                Items.Add(InputText);
            }
        }
        [RelayCommand]
        private void RemoveItem(string item)  //命令属性标记,则该方法为一个命令
        {
            if (item != null)
            {
                Items.Remove(item);
            }
        }
        public MainViewModel()
        {
            Items.Add("示例项目1");
            Items.Add("示例项目2");
        }
    }
}

2.AXAML 部分

<Window xmlns="https://github.com/avaloniaui"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:vm="using:AvaloniaMVVMDemo.ViewModels"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d" d:DesignWidth="400" d:DesignHeight="500"
        x:Class="AvaloniaMVVMDemo.Views.MainWindow"
        x:DataType="vm:MainViewModel"
        Icon="/Assets/avalonia-logo.ico"
		Width="400" Height="500"
        Title="AvaloniaMVVMDemo">

	<Grid RowDefinitions="Auto,*,Auto" Margin="10">
		<!--输入区域-->
		<StackPanel Grid.Row="0" Orientation="Horizontal" Spacing="5">
			<TextBox Text="{Binding InputText,Mode=TwoWay}" 
					 Watermark="输入新项目..."   <!--默认支持Watermark-->
					 Width="200"
					 />
			<Button Content="添加"
					Command="{Binding AddItemCommand}"    <!--正常绑定命令-->
					IsEnabled="{Binding InputText,Converter={x:Static StringConverters.IsNotNullOrEmpty}}"
					
					/>
			<!--列表区域-->
			<ListBox Grid.Row="1"
				ItemsSource="{Binding Items}"
			    Margin="0 10 0 0">
				<ListBox.ItemTemplate>
					<DataTemplate>
						<Grid ColumnDefinitions="*,Auto">
							<TextBlock Text="{Binding}" VerticalAlignment="Center" />
							<Button Grid.Column="1"
									Content="删除"  
									<!--由于当前绑定数据非MainViewModel 而命令需要使用视图模型的命令,因此通过$parent[Window].DataContext.RemoveItemCommand间接绑定到了命令-->
									Command="{Binding $parent[Window].DataContext.RemoveItemCommand }"
									CommandParameter="{Binding}"
									Margin="5 0 0 0"
									/>
						</Grid>
					</DataTemplate>
				</ListBox.ItemTemplate>
			</ListBox>
			<!--状态区域-->
			<TextBlock Grid.Row="2"  
			            <!--这里的绑定使用数据集属性,而且指定了StringFormat 格式化数据-->
					   Text="{Binding Items.Count,StringFormat='项目数量:{0}'}"
					   Margin="0 10 0 0"
					   />
		</StackPanel>
	</Grid>
</Window>