Avalonia: Как привязать выбранный идентификатор роли из ComboBox к DataContext?

Рейтинг: 0Ответов: 1Опубликовано: 30.05.2023

Есть window который содержит поля ввода данных(добавление нового user) и там есть combobox выбора роли есть класс-модель для combobox.

public class UserRole
{
    public int Id { get; set; }

    public string Title { get; set; } = null!;
}

В combobox у меня отображается Title. Данные приходят из API. Вот AXAML код:

<ComboBox Name="ComboBoxRoles"
          Items="{Binding UserRole}"
          HorizontalAlignment="Stretch"
          SelectedItem="{Binding Id}">
  <ComboBox.ItemTemplate>
    <DataTemplate>
      <TextBlock Text="{Binding Title}" />
    </DataTemplate>
  </ComboBox.ItemTemplate>
</ComboBox>

он не работает у меня в datacontext roleId всегда 0. Мне нужно, чтобы в datacontext брался id роли, то есть в combobox был загружен список ролей из API и у них есть id, нужно чтобы id выбранного элемент в combobox передавался в datacontext

<ComboBox Name="ComboBoxRoles"
          Items="{Binding UserRole}"
          HorizontalAlignment="Stretch"
          SelectedItem="{Binding Id}">
  <ComboBox.ItemTemplate>
    <DataTemplate>
      <TextBlock Text="{Binding Title}" />
    </DataTemplate>
  </ComboBox.ItemTemplate>
</ComboBox>

у меня написан такой AXAML код и такой c#:

private User _currentUser = new User();
this.DataContext = _currentUser;

я ожидала, что у выбранного элемента id будет передан в combobox при помощи этой строки SelectedItem="{Binding Id}"> но в avalonia этого не происходит roleid = 0

Ответы

▲ 0Принят

Items надо биндить к коллекции, к свойству с элементами. А SelectedItem к свойству с одним из элементов этой коллекции. А DataContext должен указывать на экземпляр класса, где эти свойства находятся.

К примеру есть свойства в неком классе

public class ViewModel
{
    public UserRole[] Roles { get; set; }
    public UserRole SelectedRole { get; set; }
}

Тогда можно создать такой пример

var vm = new ViewModel();
vm.Roles = new[]
{
    new UserRole { Id = 0, Title = "Администратор" },
    new UserRole { Id = 1, Title = "Пользователь" },
    new UserRole { Id = 2, Title = "Гость" }
};
DataContext = vm;
<ComboBox Items="{Binding Roles}"
          HorizontalAlignment="Stretch"
          SelectedItem="{Binding SelectedRole}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Title}" />
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

Если нужно управление поведением View из C#, например задавать SelectedRole програмно, то ViewModel и ее свойства должны реализовывать INotifyPropertyChanged (документация).

Если нужно динамически с отслеживанием в UI изменять состав коллекции ролей, то коллекция должна быть наблюдаемая, например ObservableCollection<T> (документация).