Avalonia MVVM

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>

posted @ 2026-02-02 19:34  丹心石  阅读(0)  评论(0)    收藏  举报