Как получить доступ к selectedItems ListBox из файла ShellViewModel.cs?

Итак, вот моя проблема:

Я хочу получить доступ к элементам (и их свойствам), которые привязаны к ListBox через Bindable Collection, в методе другого класса. (Шеллвиевмодел) Точнее: я хочу знать, какие элементы в этом списке выбраны в данный момент.

Я использую C#,Caliburn.Micro и шаблон проектирования должен быть MVVM.

Если нажата кнопка «Оценить», в соответствии с выбранными элементами ListBoxItems вызываются разные методы.

Таким образом, XAML-код в ShellView работает нормально, а также «функциональный» код «работает», но он просто работает, если я кодирую непосредственно в файле xaml.cs. (большое нет, нет)

Поскольку я новичок в этих темах, я попытался создать новый экземпляр View для доступа, но это просто даст мне контроль над ListBox, не «зная», какие элементы выбраны в исходном экземпляре.

Вот общий ListBox

<ListBox x:Name = "MainListBox" ItemsSource = "{Binding SCollection}" 
           Grid.Row = "2" Grid.Column = "1" Grid.ColumnSpan = "6" Grid.RowSpan = "1" 
           SelectionMode = "Multiple" 
                  ScrollViewer.VerticalScrollBarVisibility = "Visible" 
            ScrollViewer.HorizontalScrollBarVisibility = "Visible" 
                 MaxHeight = "300" MinHeight = "200" MaxWidth = "340" Margin = "5">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Border Margin = "0,5">
                        <StackPanel>
                            <TextBlock Text = "{Binding Path=Name}" FontWeight = "Bold" Padding = "3,5,5,5" />
                            <TextBlock Text = "{Binding Path=Info}" FontWeight = "SemiBold" Padding = "3,5,5,5" />
                        </StackPanel>
                    </Border>
                </DataTemplate>
            </ListBox.ItemTemplate>
</ListBox>
<Button x:Name = "Evaluate" Background = "Blue" Grid.Column = "1" Grid.Row = "7" MinWidth = "80" Margin = "5" Content = "Test" Grid.ColumnSpan = "1" />

Итак, вот несколько вопросов:

Есть ли аналогичное решение, такое как привязка «SelectedItem» через xaml, которая привязана к доступной переменной, для нескольких выбранных элементов? (может быть, я просто что-то пропустил?)

Есть ли способ получить доступ к «исходному» экземпляру ListBox (и, следовательно, к «живым» выбранным элементам)?

Чтобы было ясно: Единственная проблема, помимо, возможно, других лучших решений, заключается в том, что я хочу, чтобы вызываемый метод «Оценить», который привязан к кнопке, имел доступ к большим знаниям о том, какие элементы выбраны в моем ListBox.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
108
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Думаю, я правильно понял ваше беспокойство. Чтобы метод Evaluate знал, какие элементы были выбраны, вы можете использовать следующую стратегию.

Добавьте в тип коллекции свойство логический с именем IsSelected, которое поможет отслеживать выбранные элементы. Например,

public class Contact : PropertyChangedBase
{
    public string Name { get; set; }
    public string Info { get; set; }
    public bool IsSelected { get; set; }
}

Теперь предположим, что ваша коллекция определена следующим образом.

общественная ObservableCollection SCollection { получить; задавать; } = новый ObservableCollection();

Вы можете отфильтровать выбранные элементы в методе оценки следующим образом.

public void Evaluate()
{
    var selected = SCollection.Where(x => x.IsSelected);
}

Обновлять

Вам нужно будет установить для свойства IsSelected значение true во время выбора в поле списка. Это можно сделать следующим образом.

<ListBox x:Name = "MainListBox" ItemsSource = "{Binding SCollection}" 
                 SelectionMode = "Multiple" 
                 ScrollViewer.VerticalScrollBarVisibility = "Visible" 
                 ScrollViewer.HorizontalScrollBarVisibility = "Visible" 
                 MaxHeight = "300" MinHeight = "200" MaxWidth = "340" Margin = "5">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Border Margin = "0,5">
                        <StackPanel>
                            <TextBlock Text = "{Binding Path=Name}" FontWeight = "Bold" Padding = "3,5,5,5" />
                            <TextBlock Text = "{Binding Path=Info}" FontWeight = "SemiBold" Padding = "3,5,5,5" />
                        </StackPanel>
                    </Border>
                </DataTemplate>
            </ListBox.ItemTemplate>
            <ListBox.ItemContainerStyle>
                <Style TargetType = "{x:Type ListBoxItem}">
                    <Setter Property = "IsSelected" Value = "{Binding Mode=TwoWay, Path=IsSelected}"/>
                </Style>
            </ListBox.ItemContainerStyle>
        </ListBox>

Пример скриншота

Спасибо за отличный вклад. Я пробовал это, но я получаю var, выбранный как пустой ... поэтому я не знаю, может быть, я делаю что-то не так со свойством IsSelected? Есть ли что-то, что может быть очевидным, но не указано в вашем комментарии? (может ли BindableCollection также выполнять эти действия, как и наблюдаемые?)

Juretschko 04.06.2019 08:56

@Juretschko Я обновил ответ, чтобы отразить, как обновлять свойство IsSelected при изменении выбора в ListView. Я должен был включить это в ответ в первую очередь, моя ошибка. Пожалуйста, дайте мне знать, если это решит вашу проблему

Anu Viswan 04.06.2019 09:24

Большое спасибо! Он отлично работает с обновлением xaml!

Juretschko 04.06.2019 09:33

@Juretschko Рад помочь тебе

Anu Viswan 04.06.2019 09:38

Другие вопросы по теме