【问题标题】:How to access selectedItems of a ListBox from ShellViewModel.cs file?如何从 ShellViewModel.cs 文件访问 ListBox 的 selectedItems?
【发布时间】:2019-10-15 00:20:17
【问题描述】:

这是我的问题:

我想在另一个类的方法中访问通过可绑定集合绑定到 ListBox 的项目(及其属性)。 (ShellViewModel) 更准确地说:我想知道当前选择了此列表中的哪些项目。

我使用的是C#,Caliburn.Micro,设计模式应该是MVVM

如果按下“评估”按钮,根据选择的ListBoxItems,调用不同的方法。

因此,ShellView 中的 XAML 代码工作正常,“功能”代码也“工作”,但如果我直接在 xaml.cs 文件中编码,它就可以工作。 (大不,不)

因为我对这个主题很陌生,所以我尝试为访问创建一个新的 View 实例,但这只会让我控制 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 的“原始”实例(以及因此“实时”选择的项目)?

要明确: 唯一的问题是,除了其他更好的解决方案之外,我希望绑定到按钮的调用方法“Evaluate”能够深入了解在我的 ListBox 中选择了哪些项目。

【问题讨论】:

    标签: c# mvvm caliburn.micro


    【解决方案1】:

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

    在您的集合类型中添加一个名为 IsSelectedboolean 属性,这将有助于跟踪被选中的项目。例如,

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

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

    public ObservableCollection SCollection { 获取;放; } = 新的 ObservableCollection();

    您可以在 Evaluate Method 中过滤 Selected 项目,如下所示。

    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 是否也能够执行此操作,与 observable 相同?)
    • @Juretschko 我已经更新了答案,以反映在 ListView 中更改选择时如何更新 IsSelected 属性。我应该首先将其包含在答案中,这是我的错误。如果它解决了您的问题,请告诉我
    • 非常感谢! xaml 更新运行良好!
    • @Juretschko 很高兴帮助你
    猜你喜欢
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    相关资源
    最近更新 更多