少有人走的路

勇哥的工业自动化技术网站

Avalonia学习(七)MVVM演示

MVVM演示


image.png


TodoItem.cs

namespace _07_MVVM.Models;

public class TodoItem
{
    public required string Title { get; set; }
    public bool IsCompleted { get; set; }
    public string Priority { get; set; } = "Normal";
}



MainWindowViewModel.cs

using _07_MVVM.Models;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System.Collections.ObjectModel;
using System.Linq;

namespace _07_MVVM.ViewModels;

public partial class MainWindowViewModel : ObservableObject
{
    [ObservableProperty]
    private string _newTodoTitle = "";

    [ObservableProperty]
    private string _selectedPriority = "Normal";

    [ObservableProperty]
    private string _statusMessage = "待办事项:0 项";

    public string[] Priorities { get; } = { "Low", "Normal", "High", "Urgent" };
    public ObservableCollection<TodoItem> TodoItems { get; } = new();

    public MainWindowViewModel()
    {
        TodoItems.Add(new TodoItem { Title = "学习 Avalonia", Priority = "High" });
        TodoItems.Add(new TodoItem { Title = "完成 MVVM 项目", Priority = "Normal" });
        UpdateStatus();
    }

    partial void OnNewTodoTitleChanged(string value)
    {
        StatusMessage = string.IsNullOrEmpty(value)
            ? $"待办:{TodoItems.Count} 项"
            : $"输入中:{value}";
    }

    [RelayCommand]
    void AddTodo()
    {
        if (string.IsNullOrWhiteSpace(NewTodoTitle)) return;

        TodoItems.Add(new TodoItem
        {
            Title = NewTodoTitle,
            Priority = SelectedPriority
        });
        NewTodoTitle = "";
        UpdateStatus();
    }

    [RelayCommand]
    void RemoveTodo(TodoItem? item)
    {
        if (item != null)
        {
            TodoItems.Remove(item);
            UpdateStatus();
        }
    }

    [RelayCommand]
    void ToggleCompleted(TodoItem? item)
    {
        if (item != null) item.IsCompleted = !item.IsCompleted;
    }

    void UpdateStatus()
    {
        int total = TodoItems.Count;
        int done = TodoItems.Count(x => x.IsCompleted);
        StatusMessage = $"总计:{total} 项 | 已完成:{done} 项";
    }
}


App.axaml

<Application xmlns="https://github.com/avaloniaui"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             x:Class="_07_MVVM.App">

    <!-- 应用主题样式 -->
    <Application.Styles>
        <FluentTheme  /> <!-- Light=浅色 / Dark=深色 -->
    </Application.Styles>

</Application>




MainWindow.axaml

<Window xmlns="https://github.com/avaloniaui"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      
        xmlns:vm="using:_07_MVVM.ViewModels"
        xmlns:m="using:_07_MVVM.Models"
        x:Class="_07_MVVM.MainWindow"
        
        x:DataType="vm:MainWindowViewModel"
        Title="MVVM Pattern - 待办事项示例"
        Width="500"
        Height="500">

  <Window.DataContext>
    <vm:MainWindowViewModel/>
  </Window.DataContext>

  <DockPanel Margin="20">
    <StackPanel DockPanel.Dock="Top" Spacing="10" Margin="0,0,0,20">
      <TextBlock Text="待办事项管理" FontSize="20" FontWeight="Bold"/>

      <StackPanel Orientation="Horizontal" Spacing="10">
        <TextBox Text="{Binding NewTodoTitle}"
                 Watermark="输入新待办..."
                 Width="250"/>
        <ComboBox ItemsSource="{Binding Priorities}"
                  SelectedItem="{Binding SelectedPriority}"
                  Width="100"/>
        <Button Content="添加"
                Command="{Binding AddTodoCommand}"
                Padding="15,5"/>
      </StackPanel>
    </StackPanel>

    <Border DockPanel.Dock="Bottom"
            Background="#F5F5F5"
            Padding="10"
            CornerRadius="5"
            Margin="0,10,0,0">
      <TextBlock Text="{Binding StatusMessage}"
                 HorizontalAlignment="Center"/>
    </Border>

    <ListBox ItemsSource="{Binding TodoItems}">
      <ListBox.ItemTemplate>
        <!-- ✅ 数据模板显式声明 DataType,绑定 TodoItem 模型 -->
        <DataTemplate x:DataType="m:TodoItem">
          <DockPanel>
            <Button DockPanel.Dock="Right"
                    Content="删除"
                  
                    Command="{Binding $parent[ListBox].DataContext.RemoveTodoCommand}"
                    CommandParameter="{Binding}"
                    Padding="10,2"
                    Classes="Light"/>

            <CheckBox IsChecked="{Binding IsCompleted}"
                      VerticalAlignment="Center">
              <StackPanel Orientation="Horizontal" Spacing="10">
                <TextBlock Text="{Binding Title}"
                           FontSize="14">
                  <TextBlock.TextDecorations>
                   
                  </TextBlock.TextDecorations>
                </TextBlock>
                <TextBlock Text="{Binding Priority, StringFormat='[{0}]'}"
                           Foreground="Gray"
                           FontSize="12"/>
              </StackPanel>
            </CheckBox>
          </DockPanel>
        </DataTemplate>
      </ListBox.ItemTemplate>
    </ListBox>
  </DockPanel>
</Window>






效果:

act6.gif

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2026年3月    »
1
2345678
9101112131415
16171819202122
23242526272829
3031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
文章归档
网站收藏
友情链接

Powered By Z-BlogPHP 1.7.3

Copyright www.skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864