NavigateCollection.axaml代码

<Window xmlns="https://github.com/avaloniaui"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        Width="500" Height="400"
        xmlns:local="using:AvaloniaUI"
        xmlns:db="using:AvaloniaUI.Demos.Book._19.StoreDatabase"
        x:Class="AvaloniaUI.NavigateCollection"
        Title="NavigateCollection">

    <Grid Margin="10" RowDefinitions="auto,*,auto">
        <ComboBox x:Name="lstProducts"
                  ItemsSource="{Binding Products}"
                  SelectedIndex="{Binding CurrentIndex}" x:DataType="local:NavigateCollectionViewModel"/>

        <Border Grid.Row="1"
                   Margin="0,5"
                   Padding="5"
                   Background="LightSteelBlue"
                   DataContext="{Binding #lstProducts.SelectedItem}" x:DataType="db:Product">
            
            <Grid ColumnDefinitions="auto,*" RowDefinitions="auto,auto,auto,auto,*">
                <TextBlock Margin="10" Grid.Row="0">Model Number:</TextBlock>
                <TextBox Margin="5"
                         Grid.Row="0"
                         Grid.Column="1"
                         Text="{Binding ModelNumber}" />
                
                <TextBlock Margin="10" Grid.Row="2" >Unit Cost:</TextBlock>
                <TextBox Margin="5"
                         Grid.Row="2"
                         Grid.Column="1"
                         Text="{Binding UnitCost, StringFormat='{}{0:C}'}" />


                <TextBlock Margin="10" Grid.Row="3">Description:</TextBlock>
                <TextBox Margin="5"
                         Grid.Row="4"
                         Grid.Column="0"
                         Grid.ColumnSpan="2"
                         AcceptsReturn="True"
                         TextWrapping="Wrap"
                         Text="{Binding Description}" />
            </Grid>    
        </Border>

        <StackPanel Grid.Row="2" Orientation="Horizontal" x:DataType="local:NavigateCollectionViewModel">
            <Button x:Name="cmdPrev"
                    Click="cmdPrev_Click"
                    IsEnabled="{Binding CanPrev}">
                &lt;
            </Button>

            <TextBlock x:Name="lblPosition"
                       Margin="5"
                       VerticalAlignment="Center"
                       Text="{Binding PositionText}" />

            <Button x:Name="cmdNext"
                    Click="cmdNext_Click"
                    IsEnabled="{Binding CanNext}">
                &gt;
            </Button>
        </StackPanel>
    </Grid>
    </Window>

NavigateCollection.axaml.cs代码

using Avalonia;
using Avalonia.Controls;
using Avalonia.Interactivity;
using AvaloniaUI.Demos.Book._19.StoreDatabase;
using CommunityToolkit.Mvvm.ComponentModel;
using System;
using System.Collections.ObjectModel;

namespace AvaloniaUI;
public partial class NavigateCollectionViewModel : ObservableObject
{
    private StoreDb1 db = new StoreDb1();

    public ObservableCollection<Product> Products { get; }

    [ObservableProperty]
    private int currentIndex;

    [ObservableProperty]
    private string? positionText;

    [ObservableProperty]
    private bool canPrev;

    [ObservableProperty]
    private bool canNext;

    public NavigateCollectionViewModel()
    {
        Products = db.GetProducts();

        if (Products.Count > 0)
        {
            CurrentIndex = 0;
        }

        UpdateNavigationState();
    }
    public void ApplyFilter(decimal minimumPrice)
    {
        // 删除所有不符合过滤条件的项
        for (int i = Products.Count - 1; i >= 0; i--)
        {
            if (Products[i].UnitCost <= minimumPrice)
            {
                Products.RemoveAt(i);
            }
        }

        // 当前索引超出范围,需要修正
        if (CurrentIndex >= Products.Count)
        {
            CurrentIndex = Products.Count - 1;
        }

        if (CurrentIndex < 0)
        {
            CurrentIndex = 0;
        }

        UpdateNavigationState();
    }
    public void RemoveFilter()
    {
        Products.Clear();

        var items = db.GetProducts();

        foreach (var product in items)
        {
            Products.Add(product);
        }

        if (Products.Count > 0)
        {
            CurrentIndex = 0;
        }
        else
        {
            CurrentIndex = -1;
        }

        UpdateNavigationState();
    }
    partial void OnCurrentIndexChanged(int value)
    {
        UpdateNavigationState();
    }

    private void UpdateNavigationState()
    {
        if (Products.Count == 0)
        {
            PositionText = "No records";
            CanPrev = false;
            CanNext = false;
            return;
        }

        PositionText = $"Record {CurrentIndex + 1} of {Products.Count}";
        CanPrev = CurrentIndex > 0;
        CanNext = CurrentIndex < Products.Count - 1;
    }
}
public partial class NavigateCollection : Window
{
  
    public NavigateCollection()
    {
        InitializeComponent();
        this.DataContext = new NavigateCollectionViewModel();
    }
    private void cmdPrev_Click(object? sender, RoutedEventArgs e)
    {
        if (DataContext is NavigateCollectionViewModel viewModel)
        {
            if (viewModel.CurrentIndex > 0)
            {
                viewModel.CurrentIndex--;
            }
        }
    }

    private void cmdNext_Click(object? sender, RoutedEventArgs e)
    {
        if (DataContext is NavigateCollectionViewModel viewModel)
        {
            if (viewModel.CurrentIndex < viewModel.Products.Count - 1)
            {
                viewModel.CurrentIndex++;
            }
        }
    }
}

运行效果

image

 

posted on 2026-02-12 13:23  dalgleish  阅读(5)  评论(0)    收藏  举报