Выберите ComboBoxItem автоматически на основе другого выбранного значения ComboBoxItem - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть форма с некоторыми полями и двумя полями со списком. Моя модель представления содержит несколько экземпляров класса User, который содержит атрибуты name и profile.

ViewModel

    public class UserViewModel: INotifyPropertyChanged
    {
        private ObservableCollection<User> usersList = new ObservableCollection<User>();
        private User selectedUser = new User();
        private User newUser = new User();

        public UserViewModel()
        {
        }

        public ObservableCollection<User> UsersList
        {
            get
            {
                return this.usersList;
            }

            set
            {
                this.usersList = value;
                this.OnPropertyChanged();
            }
        }

        public User SelectedUser
        {
            get
            {
                return this.selectedUser;
            }

            set
            {
                this.selectedUser = value;
                this.OnPropertyChanged();
            }
        }

        public User NewUser
        {
            get
            {
                return this.newUser;
            }

            set
            {
                this.newUser = value;
                this.OnPropertyChanged();
            }
        }

        private void OnPropertyChanged([CallerMemberName] string propertyName = "")
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }
 }

Код-за

this.userViewModel = new UserViewModel();
this.DataContext = this.userViewModel;

XAML

<-- The DataContext for this ComboBox is the entire UserViewModel -->
<ComboBox
        Height="Auto"
        Width="Auto"
        IsEditable="True"
        IsTextSearchCaseSensitive="False"
        SelectedItem="SelectedUser">
    <ComboBoxItem Content="Mary" IsSelected="True"></ComboBoxItem>
    <ComboBoxItem Content="John"></ComboBoxItem>
</ComboBox>

Если я выбираю пользователя из первого списка, все поля формы заполняются существующими данными. Независимо от выбранного пользователя, он будет сохранен в SelectedUser через свойство SelectedItem.

<Grid>
    <Grid.DataContext>
        <PriorityBinding>
            <Binding Path="SelectedUser" Converter="{StaticResource NullToDependencyPropertyUnsetConverter}" />
            <Binding Path="NewUser" />
        </PriorityBinding>
    </Grid.DataContext>
    [...]
    <-- The DataContext for this ComboBox will be SelectedUser or NewUser, depending on the case -->
    <ComboBox
            Name="profileComboBox"
            Height="Auto"
            Width="Auto"
            IsEditable="True"
            IsTextSearchCaseSensitive="False"
            SelectedItem="Profile">
        <ComboBoxItem Content="User" IsSelected="True"></ComboBoxItem>
        <ComboBoxItem Content="Admin"></ComboBoxItem>
    </ComboBox>
    [...]
</Grid>

ComboBox будет иметь SelectedUser или NewUser в качестве DataContext в зависимости от того, является ли SelectedUser нулевым или нет. Затем, какой бы профиль я ни выбрал, он будет сохранен в атрибуте Profile ранее выбранного пользователя через свойство SelectedItem.

Моя проблема в том, что второй выпадающий список должен автоматически выбирать соответствующий профиль («Пользователь» или «Администратор») пользователя, только что выбранного в первом выпадающем списке. Может ли это быть достигнуто только с использованием XAML?

1 Ответ

0 голосов
/ 08 ноября 2018

Привязать SelectedItem второго ComboBox к свойству Profile выбранного в данный момент User:

SelectedItem="{Binding SelectedUser.Profile}"

или

SelectedItem="{Binding SelectedItem.Profile, ElementName=userComboBox}"

Также удалите элементы из ComboBox и присвойте свойству DisplayMemberPath имя свойства типа Profile:

<ComboBox
        Name = "profileComboBox"
        IsEditable="True"
        IsTextSearchCaseSensitive="False"
        DisplayMemberPath="Name"
        SelectedItem="{Binding SelectedUser.Profile}">
</ComboBox>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...