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}"> < </Button> <TextBlock x:Name="lblPosition" Margin="5" VerticalAlignment="Center" Text="{Binding PositionText}" /> <Button x:Name="cmdNext" Click="cmdNext_Click" IsEnabled="{Binding CanNext}"> > </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++;
}
}
}
}
运行效果

浙公网安备 33010602011771号