如何从 ShellViewModel.cs 文件访问 ListBox 的 selectedItems?

How to access selectedItems of a ListBox from ShellViewModel.cs file?

所以这是我的问题:

我想使用另一个 class 的方法访问通过 Bindable Collection 绑定到 ListBox 的项目(及其属性)。 (外壳视图模型) 更准确地说:我想知道当前选择了此列表中的哪些项目。

我正在使用 C#,Caliburn.Micro 并且设计模式应该是 MVVM.

如果按下按钮 "Evaluate",根据所选的 ListBoxItems,将调用不同的方法。

所以 ShellView 中的 XAML-代码工作正常,"functional" 代码 "works",但如果我直接在 [=58] 中编码,它就可以工作=]-文件。 (大不,不)

因为我对这个主题很陌生,所以我尝试创建一个新的视图实例来访问,但这只会让我控制 ListBox 而没有 "knowing" 哪些项目是在原始实例中选择。

这里是通用的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" />

所以这里有一些问题:

是否有类似的解决方案,例如通过 xaml 绑定 "SelectedItem",绑定到可访问的变量,用于多个选定的项目?(也许我只是错过了那里的东西?)

有没有办法访问 ListBox 的 "original" 实例(因此 "live"-selected Items)?

明确一点: 除了其他更好的解决方案之外,唯一的问题是,我希望绑定到按钮的调用方法 "Evaluate" 能够获得有关在我的 ListBox 中选择了哪些项目的丰富知识。

我相信我正确理解了您的担忧。要让 Evaluate 方法知道选择了哪些 Items,您可以采用以下策略。

在名为 IsSelected 的 Collection 类型中添加一个 boolean 属性,这将有助于跟踪选择的项目。例如,

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

现在假设您的 Collection 定义如下。

public 可观察Collection 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>

示例屏幕截图