Итак, вот моя проблема:
Я хочу получить доступ к элементам (и их свойствам), которые привязаны к 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.
Думаю, я правильно понял ваше беспокойство. Чтобы метод 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>
Пример скриншота
@Juretschko Я обновил ответ, чтобы отразить, как обновлять свойство IsSelected при изменении выбора в ListView. Я должен был включить это в ответ в первую очередь, моя ошибка. Пожалуйста, дайте мне знать, если это решит вашу проблему
Большое спасибо! Он отлично работает с обновлением xaml!
@Juretschko Рад помочь тебе
Спасибо за отличный вклад. Я пробовал это, но я получаю var, выбранный как пустой ... поэтому я не знаю, может быть, я делаю что-то не так со свойством IsSelected? Есть ли что-то, что может быть очевидным, но не указано в вашем комментарии? (может ли BindableCollection также выполнять эти действия, как и наблюдаемые?)