Как получить доступ к выбранным элементам ListBox из файла ShellViewModel.cs? - PullRequest
0 голосов
/ 29 мая 2019

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

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

Я использую 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 (и, следовательно, к «живым» выбранным элементам)?

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

1 Ответ

0 голосов
/ 30 мая 2019

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

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

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

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

public ObservableCollection SCollection {get; задавать; } = new 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>

Пример снимка экрана

enter image description here

...