0

Всем доброго времени суток. У меня есть listbox который сделанный в виде меню. При выборе элемента у меня происходит навигация на другую страницу в Contetncontrol-е. Мне необходимо поменять выбранный элемент Listbox-а на то, что было выбрано на другой странице.

Listbox :

<ListBox Grid.Column="0"
                         ItemsSource="{Binding MenuItem}"
                         SelectedItem="{Binding SelectedMenuItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <Image Source="{Binding ImagePath}"
                                       Width="24"
                                       Margin="15,5,15,5" />
                                <TextBlock Text="{Binding Name}"
                                           Width="150"
                                           TextWrapping="Wrap"
                                           VerticalAlignment="Center"
                                           Style="{StaticResource FontStyle}"
                                           FontSize="16" />
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                    <ListBox.ItemContainerStyle>
                        <Style TargetType="ListBoxItem"
                               BasedOn="{StaticResource MaterialDesignListBoxItem}">
                            <Style.Triggers>
                                <Trigger Property="IsSelected"
                                         Value="True">
                                    <Setter Property="Background"
                                            Value="#166051" />
                                </Trigger>
                            </Style.Triggers>
                        </Style>
                    </ListBox.ItemContainerStyle>
                </ListBox>

View Model:

/// <summary>
        /// Список элементов меню
        /// </summary>
        public List<MenuModel> MenuItem { get; set; }
    /// &lt;summary&gt;
    /// Выбранный элемент из меню
    /// &lt;/summary&gt;
    private MenuModel _selectedMenuItem;

    public MenuModel SelectedMenuItem
    {
        get { return _selectedMenuItem; }
        set
        {
            _selectedMenuItem = value;
            OnPropertyChanged(&quot;SelectedModule&quot;);
            GoNext();

        }
    }

Заполнение Listbox в конструкторе ViewModel:

            MenuItem = new List<MenuModel>()
            {
                new MenuModel("ДОМОЙ", $"/Resources/Icons/HamburgerMenuIcons/Домой.ico"),
                new MenuModel("ПОЛЕВОЙ ДНЕВНИК", $"/Resources/Icons/HamburgerMenuIcons/Полевой-дневник.ico"),
                new MenuModel("КАТАЛОГ", $"/Resources/Icons/HamburgerMenuIcons/Каталог.ico"),
                new MenuModel("ЛАБАРАТОРНЫЕ АНАЛИЗЫ", $"/Resources/Icons/HamburgerMenuIcons/Лабараторные-анализы.ico"),
                new MenuModel("КАРТА", $"/Resources/Icons/HamburgerMenuIcons/Карта.ico"),
                new MenuModel("ФОНДОВЫЕ", $"/Resources/Icons/HamburgerMenuIcons/Фондовые.ico"),
                new MenuModel("АРХИВ", $"/Resources/Icons/HamburgerMenuIcons/Архив.ico"),
        };

Функция GoNext для смены страницы:

public void GoNext()
        {
            switch (SelectedMenuItem.Name)
            {
                case "ДОМОЙ":
                    _navigationmaneger.Navigate("Menu")
                    break;
                case "ПОЛЕВОЙ ДНЕВНИК":
                    _navigationmaneger.Navigate("ProjectPage");
                    break;
                case "КАТАЛОГ":
                    MessageService.ShowMessage("Данный пункт в разработке");
                    break;
                case "ЛАБАРАТОРНЫЕ АНАЛИЗЫ":
                    MessageService.ShowMessage("Данный пункт в разработке");
                    break;
                case "КАРТА":
                    MessageService.ShowMessage("Данный пункт в разработке");
                    break;
                case "ФОНДОВЫЕ":
                    MessageService.ShowMessage("Данный пункт в разработке");
                    break;
                case "АРХИВ":
                    MessageService.ShowMessage("Данный пункт в разработке");
                    break;
            }
        }

На изображение Красный - Другая страница имеющая свою View и ViewModel Желтый - Listbox. Как из страницы в которой красным квадратом выделено передать что была нажата к примеру "Полевой дневник" то и в listbox был соответствующий выбор? введите сюда описание изображения

  • Каким образом устанавливается DataContext для главного окна и страниц внутри Contetncontrol ? – alex6327 Sep 16 '22 at 05:57
  • По сути навигация сводится к замене вьюмодели в правой части окна, заведите синглтон, который например имеет .Navigate<T>() и вызывайте его откуда угодно. У вас же есть что-то подобное _navigationmaneger, вот его и сделайте синглтоном. А чтобы распределить зависимости по классам, можно использовать IoC. – aepot Sep 16 '22 at 06:00
  • Я бы сделал так: во всех классах типа "отдельная страница" унаследовал бы от какого-нибудь интерфейса с эвентом. Далее при создании нового MenuModel - подписывался бы на этот эвент. А сам эвент бы вызывал в методе с кликом на кнопку. Соответственно когда эвент вызовится - у вас в вашей ViewModel "желтой зоне", где лежат все эти MenuModel - вызовется этот эвент. В сам эвент, в вашем случае - проще всего кидать саму MenuModel, дальше как угодно, можете приводить типы или любые другие отличительные возможности использовать, чтобы понять в какой ViewModel была нажата кнопка – Melkor V Sep 16 '22 at 10:07
  • Если не знакомы с термином эвент - почитайте про EventHandler в c#, если прям вообще не охота разбираться - просто используйте делегат Action – Melkor V Sep 16 '22 at 10:10
  • @MelkorV Спасибо почитаю, буду разбираться ! – misterNull Sep 19 '22 at 02:20

0 Answers0