Avalonia: Как привязать выбранный идентификатор роли из ComboBox к DataContext?
Есть 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
Ответы (1 шт):
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> (документация).