< /code>
Вот как объявляются соответствующие свойства < /p>
public ObservableCollection Ids { get; } = [];
public string? Id
{
get => _id;
set
{
if (_id != value)
{
_id = value;
OnPropertyChanged();
}
}
}
< /code>
Все привязки работает. Когда элементы в коллекции изменяются, элементы в выпадании меняются. Если ID изменяется программно, обновления ComboBox и наоборот. Тем не менее, какими бы ни были «начальные» значения ComboBox , когда -то загруженные данные, по -видимому, определяют высоту ComboBox при открытии. На следующем скриншоте показан пример этого: изначально было еще несколько элементов, и теперь, когда в коллекции были удалены эти элементы, у нее все еще есть «пространство» для них:
nofling simlediled water industide watfied custome7.png "/> no stimelied wormated water simledied aflicedied aflied aflied aflied aflied aflied water smentledied water industide. чем «свободно» стиль в .net 9. Удаление его из справедливости все еще, кажется, делает современный стиль этих элементов. (Фактически, я попытался удалить все стиль, включая прокладку, и это все еще происходит.) Я должен сделать что -то особенное, чтобы получить ComboBox для изменения размера? Шаги для воспроизведения: < /p>
- Откройте приложение. Нажмите на один или оба раскрывающихся. Это должно быть выглядеть так
< /code>
MainWindow.xaml
Load Options
< /code>
MainWindow.xaml.cs
using System.Windows;
namespace ComboBoxResizing;
public partial class MainWindow : Window
{
private readonly ViewModel ViewModel;
public MainWindow()
{
InitializeComponent();
ViewModel = (ViewModel)DataContext;
}
private async void LoadStuff(object sender, RoutedEventArgs e)
{
await ViewModel.LoadStuff();
}
}
< /code>
ViewModel.cs
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Collections.ObjectModel;
namespace ComboBoxResizing;
public record Thing(string A, string B);
public class ViewModel : INotifyPropertyChanged
{
private List Things = [];
private string? _a;
private string? _b;
public event PropertyChangedEventHandler? PropertyChanged;
private void OnPropertyChanged([CallerMemberName] string propertyName = "") =>
PropertyChanged?.Invoke(this, new(propertyName));
public ObservableCollection As { get; } = [];
public ObservableCollection Bs { get; } = [];
public string? A
{
get => _a;
set
{
if (_a != value)
{
_a = value;
OnPropertyChanged();
var newBs = Things.Where(t => t.A == A).Select(t => t.B).Distinct();
// Doing this instead of removing all and adding prevents "null" being set if the "B" is in there
foreach (var b in Bs.Except(newBs).ToArray())
Bs.Remove(b);
foreach (var b in newBs.Except(Bs).ToArray())
Bs.Add(b);
B = newBs.Any(b => b == B) ? B : newBs.FirstOrDefault();
}
}
}
public string? B
{
get => _b;
set
{
if (_b != value)
{
_b = value;
OnPropertyChanged();
}
}
}
public async Task LoadStuff()
{
Things.Clear();
await Task.Delay(1_000);
Things =
[
..Enumerable.Range(0, 4).Select(b => new Thing("Foo", b.ToString())),
..Enumerable.Range(0, 15).Select(b => new Thing("Bar", b.ToString())),
..Enumerable.Range(0, 2).Select(b => new Thing("Baz", b.ToString())),
];
As.Clear();
var newAs = Things.Select(t => t.A).Distinct();
foreach (var a in newAs)
As.Add(a);
A = As.FirstOrDefault()!;
}
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... ems-change