Я создаю проект .net Maui с двумя сетками данных. Первая сетка данных будет отображать выбор категорий и будет многосекционной. Второй показан список элементов, которые отображаются в зависимости от того, какая категория выбран. Я делаю это, добавив эту команду в метод Onpearing в коде:
passwordGrid.HeightRequest = passwordGrid.HeaderRowHeight + passwordGrid.RowHeight * 5;
< /code>
Теперь, когда я изначально выбираю категорию из первой сетки данных, которая содержит 5 элемента, элементы отображаются в сетке 2 без проблем. Категория является отключенной вертикальной прокручивающейся полосой. Строка прокрутки будет включена только в том случае, если я вручную горизонтально изменяю размер страницы содержимого до тех пор, пока не исчезнет правая граница второй сетки, а затем я изменяю размер страницы содержимого, чтобы граница сетки появилась.
< /code>
А вот код позади: < /p>
using CommunityToolkit.Maui.Views;
using DataGrid.Models;
using DataGrid.Services;
using Syncfusion.Maui.DataGrid;
using System.Collections.ObjectModel;
using System.ComponentModel;
namespace DataGrid
{
public partial class MainPage : ContentPage
{
private PasswordViewModel viewModel;
public MainPage()
{
InitializeComponent();
viewModel = new PasswordViewModel();
this.BindingContext = viewModel;
}
protected override void OnAppearing()
{
base.OnAppearing();
// Only set the height request for the grid
passwordGrid.HeightRequest = passwordGrid.HeaderRowHeight + passwordGrid.RowHeight * 5;
}
private async void OnSelectDatabaseClicked(object sender, EventArgs e)
{
await ShowDatabaseSelectionPopup();
}
private async Task ShowDatabaseSelectionPopup()
{
var popup = new DatabaseSelectionPopup();
var result = await this.ShowPopupAsync(popup);
if (result is bool selectDatabase && selectDatabase)
{
viewModel.LoadDatabaseData();
}
}
private void GroupGrid_SelectionChanged(object sender, DataGridSelectionChangedEventArgs e)
{
var grid = sender as SfDataGrid;
if (grid == null)
return;
var selectedRows = grid.SelectedRows;
foreach (var item in viewModel.Groups)
{
item.IsSelected = selectedRows.Contains(item);
}
// refresh the passwords grid
viewModel.UpdatePasswordsBasedOnSelectedGroups();
}
}
public class Password
{
public int Id { get; set; }
public string Title { get; set; }
public string Username { get; set; }
public string Value { get; set; }
public int GroupId { get; set; }
public Password(int id, string title, string username, string value, int groupId)
{
Id = id;
Title = title;
Username = username;
Value = value;
GroupId = groupId;
}
}
public class PasswordViewModel : INotifyPropertyChanged
{
private ObservableCollection
_groups;
private ObservableCollection _allPasswords;
private ObservableCollection _filteredPasswords;
private bool _pwVisible;
private DatabaseService _databaseService;
public event PropertyChangedEventHandler? PropertyChanged;
public ObservableCollection Groups
{
get { return _groups; }
set
{
_groups = value;
OnPropertyChanged(nameof(Groups));
}
}
public ObservableCollection AllPasswords
{
get { return _allPasswords; }
set
{
_allPasswords = value;
OnPropertyChanged(nameof(AllPasswords));
}
}
public ObservableCollection FilteredPasswords
{
get { return _filteredPasswords; }
set
{
_filteredPasswords = value;
OnPropertyChanged(nameof(FilteredPasswords));
}
}
public bool PwVisible
{
get { return _pwVisible; }
set
{
if (_pwVisible != value)
{
_pwVisible = value;
OnPropertyChanged(nameof(PwVisible));
}
}
}
public PasswordViewModel()
{
_databaseService = new DatabaseService();
_groups = _databaseService.Groups;
_allPasswords = _databaseService.OrderItemsDataSource;
_filteredPasswords = new ObservableCollection();
}
public void LoadDatabaseData()
{
// This simulates loading data from a database selected via popup
_databaseService.InitializeDatabase();
// Make sure our collections reference the updated data
Groups = _databaseService.Groups;
AllPasswords = _databaseService.OrderItemsDataSource;
}
public void UpdatePasswordsBasedOnSelectedGroups()
{
FilteredPasswords.Clear();
var selectedGroupIds = Groups.Where(g => g.IsSelected).Select(g => g.Id).ToList();
foreach (var password in AllPasswords)
{
if (selectedGroupIds.Contains(password.GroupId))
{
FilteredPasswords.Add(password);
}
}
if (FilteredPasswords.Count > 0)
{
// Make PwVisible true only when there are passwords to show, false otherwise
PwVisible = true;
}
}
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
Мой вопрос: почему я должен вручную изменить размер страницы контента, чтобы включить полосу прокрутки?
Я создаю проект .net Maui с двумя сетками данных. Первая сетка данных будет отображать выбор категорий и будет многосекционной. Второй показан список элементов, которые отображаются в зависимости от того, какая категория выбран. Я делаю это, добавив эту команду в метод Onpearing в коде: [code]passwordGrid.HeightRequest = passwordGrid.HeaderRowHeight + passwordGrid.RowHeight * 5; < /code> Теперь, когда я изначально выбираю категорию из первой сетки данных, которая содержит 5 элемента, элементы отображаются в сетке 2 без проблем. Категория является отключенной вертикальной прокручивающейся полосой. Строка прокрутки будет включена только в том случае, если я вручную горизонтально изменяю размер страницы содержимого до тех пор, пока не исчезнет правая граница второй сетки, а затем я изменяю размер страницы содержимого, чтобы граница сетки появилась.
< /code> А вот код позади: < /p> using CommunityToolkit.Maui.Views; using DataGrid.Models; using DataGrid.Services; using Syncfusion.Maui.DataGrid; using System.Collections.ObjectModel; using System.ComponentModel;
namespace DataGrid { public partial class MainPage : ContentPage { private PasswordViewModel viewModel;
public MainPage() { InitializeComponent(); viewModel = new PasswordViewModel(); this.BindingContext = viewModel; }
private async Task ShowDatabaseSelectionPopup() { var popup = new DatabaseSelectionPopup(); var result = await this.ShowPopupAsync(popup);
if (result is bool selectDatabase && selectDatabase) { viewModel.LoadDatabaseData(); } }
private void GroupGrid_SelectionChanged(object sender, DataGridSelectionChangedEventArgs e) { var grid = sender as SfDataGrid;
if (grid == null) return;
var selectedRows = grid.SelectedRows;
foreach (var item in viewModel.Groups) { item.IsSelected = selectedRows.Contains(item); }
// refresh the passwords grid viewModel.UpdatePasswordsBasedOnSelectedGroups(); } }
public class Password { public int Id { get; set; } public string Title { get; set; } public string Username { get; set; } public string Value { get; set; } public int GroupId { get; set; }
public Password(int id, string title, string username, string value, int groupId) { Id = id; Title = title; Username = username; Value = value; GroupId = groupId; } }
public event PropertyChangedEventHandler? PropertyChanged;
public ObservableCollection Groups { get { return _groups; } set { _groups = value; OnPropertyChanged(nameof(Groups)); } }
public ObservableCollection AllPasswords { get { return _allPasswords; } set { _allPasswords = value; OnPropertyChanged(nameof(AllPasswords)); } }
public ObservableCollection FilteredPasswords { get { return _filteredPasswords; } set { _filteredPasswords = value; OnPropertyChanged(nameof(FilteredPasswords)); } }
public bool PwVisible { get { return _pwVisible; } set { if (_pwVisible != value) { _pwVisible = value; OnPropertyChanged(nameof(PwVisible)); } } }
public PasswordViewModel() { _databaseService = new DatabaseService(); _groups = _databaseService.Groups; _allPasswords = _databaseService.OrderItemsDataSource; _filteredPasswords = new ObservableCollection(); }
public void LoadDatabaseData() { // This simulates loading data from a database selected via popup _databaseService.InitializeDatabase();
// Make sure our collections reference the updated data Groups = _databaseService.Groups; AllPasswords = _databaseService.OrderItemsDataSource; }
public void UpdatePasswordsBasedOnSelectedGroups() { FilteredPasswords.Clear();
var selectedGroupIds = Groups.Where(g => g.IsSelected).Select(g => g.Id).ToList();
foreach (var password in AllPasswords) { if (selectedGroupIds.Contains(password.GroupId)) { FilteredPasswords.Add(password); } }
if (FilteredPasswords.Count > 0) { // Make PwVisible true only when there are passwords to show, false otherwise PwVisible = true; } }
protected void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } } [/code] Мой вопрос: почему я должен вручную изменить размер страницы контента, чтобы включить полосу прокрутки?