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>