mscrack
@mscrack

Как загрузить UserControl при клике на элемент ListBox?

Всем привет. Данный вопрос продолжение этого.
Решил я не использовать Windows Form а написать приложение на WPF. Немного изменив интерфейс и заодно изучив новую для себя тему. Интерфейс, по моей задумке будет выглядить так
5ca46937464a6835277528.png

При клике на элемент listboxa должен загружаться usercontrol (главный), в нем при щелчке на checkbox должен загружаться usercontrol с таблицей в которой пользователь указывает данные для расчета (всего 3 таблицы, т.е. 3 usercontrola) На данный момент реализовал добавление элемента в listbox.
MainWindowViewModel.cs

class MainWindowViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        private string _contentToAdd;
        private ObservableCollection<string> _devList;
        public ICommand AddCommand { get; set; }

        public void NotifyPropertyChanged(string propertyname)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyname));
            }
        }
        
        public MainWindowViewModel()
        {
            _devList = new ObservableCollection<string>();
            AddCommand = new DelegateCommand(Add);
        }

        public ObservableCollection<string> DevList
        {
            get { return this._devList; }
            set { this._devList = value; }
        }
        public string ContentToAdd
        {
            get { return this._contentToAdd; }
            set { this._contentToAdd = value; NotifyPropertyChanged("ContentToAdd"); }
        }
        public void Add(object parameter)
        {
            DevList.Add(ContentToAdd);
        }       
    }



MainWindow.xaml

<Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="60"/>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>
            
            <StackPanel Grid.Row="0">
                    <Button x:Name="btn_add_list" Content="Добавить" Command="{Binding AddCommand}"  Margin="0,5,0,5"/>
                    <TextBox Text="{Binding ContentToAdd}" x:Name="item_title_txt" Height="23" TextWrapping="Wrap" Margin="0,5,0,10" Tag="Название устройства"/>
            </StackPanel>
                <ListBox ItemsSource="{Binding DevList}" Grid.Row="1" x:Name="device_list" ></ListBox>
            </Grid>



Не пойму как мне теперь при клике на элемент listboxa подгружать usercontrol (данные со всех элементов listboxa должны сохраняться, то есть если я перейду на элемент2 а потом на элемент1 данные не должна пропасть).
Правильно ли я понял, мне надо повесить событие на элемент listboxa при срабатывании которого будет загружаться usercontrol и помещаться в какой нибудь список, а при срабатывании события будет проверка с этим списком. Так же нужна модель которая будет у каждого usercontrola собирать значения и так же помещать их в список, т.е. это все должно происходить при клике на элемент. Не пойму как так сделать, может есть пример посмотреть или почитать.. Насколько вообще правильно я делаю, может есть способ более правильный?
  • Вопрос задан
  • 689 просмотров
Решения вопроса 1
lexxpavlov
@lexxpavlov
Программист, преподаватель
Вам нужно просто связать датаконтекст групбоксов с выделенным элементом списка. Всё остальное сделает WPF.
<ListBox ItemsSource="{Binding DevList}" SelectedItem="{Binding SelectedElement}" />
<GroupBox DataContext="{Binding SelectedElement}">
</GroupBox>
<GroupBox DataContext="{Binding SelectedElement.Subelement1}">
</GroupBox>


Чтобы это заработало, то нужно сделать так, чтобы DevList был список объектов, а не строк. Создайте класс (вьюмодель) для ваших элементов списка. В нём можно хранить те свойства, которые вы хотите показывать в групбоксах. То есть, в списке элементов хранятся ваши объекты, а потом они же указываются датаконтекстом в другие контролы (групбоксы).

В таком случае хорошо сделать во вьюмодели реализацию INotifyPropertyChanged.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы