【问题标题】:WPF Listbox multi selectionWPF 列表框多选
【发布时间】:2013-10-24 05:29:27
【问题描述】:

我在我的应用程序中使用 wpf 列表框(VS 2012,C#)。我在多选时遇到问题,情况是列表框在列表框行上有按钮我可以使用此按钮打开新表单以及更新该行的列表框上的值,但是如果我在列表框中选择了多行,则突出显示的行信息会丢失。例如:如果列表框有 5 行,如果我选择了第 2、3、4 行,如果我单击第 3 行的按钮打开弹出窗口并进行更新操作。突出显示的信息在弹出窗口关闭时丢失。我能够在按钮的单击事件上的选定行索引后面的代码中获取信息。如何在后面的代码中应用这个选定的行事件反映在 UI 上。

XAML 部分的样式

    <Style x:Key="AlternatingListViewItemStyle" TargetType="{x:Type ListBoxItem}">
                <Style.Triggers>
                    <Trigger Property="ItemsControl.AlternationIndex" Value="0">
                        <Setter Property="Background" Value="White"/>
                    </Trigger>
                    <Trigger Property="ItemsControl.AlternationIndex" Value="1">
                        <Setter Property="Background" Value="DarkGray"/>
                    </Trigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsSelected" Value="True"/>
                            <Condition Property="ItemsControl.AlternationIndex" Value="0"/>
                        </MultiTrigger.Conditions>
                        <MultiTrigger.Setters>
                            <Setter Property="Foreground" Value="LightBlue"/>
                            <Setter Property="Background" Value="LightBlue"/>
                        </MultiTrigger.Setters>
                    </MultiTrigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsSelected" Value="True"/>
                            <Condition Property="ItemsControl.AlternationIndex"
                              Value="1"/>
                        </MultiTrigger.Conditions>
                        <MultiTrigger.Setters>
                            <Setter Property="Foreground" Value="LightBlue"/>
                            <Setter Property="Background" Value="LightBlue"/>
                        </MultiTrigger.Setters>
                    </MultiTrigger>
                </Style.Triggers>
                <Style.Resources>
                    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}"  Color="LightBlue"/>
                    <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="LightBlue"/>
                </Style.Resources>
                <Setter Property="IsSelected" Value="{Binding Mode=TwoWay, Path=IsSelected}"/>
            </Style>

<ListBox ItemsSource="{Binding Data}" ItemContainerStyle="{StaticResource AlternatingListViewItemStyle}" AlternationCount="2"   SelectionMode="Multiple" >
.
.
.
.
</Listbox>

按钮点击事件代码

 List<int> selectedItemIndexes = (from object o in listBox.SelectedItems select listBox.Items.IndexOf(o)).ToList();


    listBox.UnselectAll();

    foreach (int rowIndex in selectedItemIndexes)
    {

    // listBox.SelectedIndex = rowIndex;  // Tried this as well
     listBox.SelectedItem = listBox.Items.GetItemAt(rowIndex);

    }

任何帮助将不胜感激。

【问题讨论】:

  • 如果你想让他们被选中,你会首先取消选择谁?
  • 只是为了确保除了存储的 selectedItemIndexes 之外没有其他行突出显示。

标签: c# wpf xaml visual-studio-2012 listbox


【解决方案1】:

您以这种方式获得了您选择的项目,您也需要以这种方式设置它们:

listBox.SelectedItems.Add( listBox.Items.GetItemAt(rowIndex) );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多