按列对列表框排序

安倍

成员
已加入
2017年3月16日
留言内容
20
编程经验
Beginner
我有一个列表框,里面有一些库存。我需要做的是当我按“数量”时,它将整个表和行都以1个单位排序。因此,在图像示例中,如果我第一行有数量2,第二行有数量3,它将把整行(填充皮革)放在顶部,(盾牌)放在下面。

这是我现在拥有的代码,排序不正确。
C#:
        private void Label_MouseDown_1(object sender, MouseButtonEventArgs e)
        {
            tab_armor.Items.SortDescriptions.Add(
            new System.ComponentModel.SortDescription("qty",
            System.ComponentModel.ListSortDirection.Ascending));
        }
1234.PNG
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,076
地点
挪威
编程经验
10+
在添加之前尝试.SortDescriptions.Clear()。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
在添加之前尝试.SortDescriptions.Clear()。

如果执行该操作,那么它大概将仅按该列排序,而不考虑之前的任何排序。那可能是想要的,但也可能是您想保留先前的排序作为次要排序。在这种情况下,我认为您不会调用Clear而是调用Insert而不是Add,因此新排序是首先完成而不是最后一次。您也不想允许对同一列进行两次排序,因为这可能会导致出现很长的SortDescriptions列表,因此您必须检查是否已对新列进行了排序并将其删除。
private void SortArmor(string columnName)
{
    var sortDescription = tab_armor.Items.SortDescriptions.SingleOrDefault(sd => sd.PropertyName == columnName);

    if (sortDescription.PropertyName == null)
    {
        // The list was NOT already sorted by this column.
        sortDescription.PropertyName = columnName;
        sortDescription.Direction=ListSortDirection.Ascending;
    }
    else
    {
        // The list was already sorted by this column.
        tab_armor.Items.SortDescriptions.Remove(sortDescription);
    }

    tab_armor.Items.SortDescriptions.Insert(0, sortDescription);
}

我没有测试过,但似乎应该可以。
 

安倍

成员
已加入
2017年3月16日
留言内容
20
编程经验
Beginner
谢谢您回复我。我添加了一行,它仍然在做同样的事情。考虑一下,可能是因为我没有设置列?您看到的所有文本只是我放在ListBox中的标签。我不确定如何将第一行声明为列。假设这就是为什么它不起作用?

这是列表框的XAML

C#:
 <ListBox x:Name="tab_armor" Width="620"  ScrollViewer.HorizontalScrollBarVisibility="Disabled" Margin="13,172,10.2,38.8" Background="{x:Null}" HorizontalAlignment="Stretch" HorizontalContentAlignment="Left" ScrollViewer.VerticalScrollBarVisibility="Visible" BorderBrush="{x:Null}" AutomationProperties.IsColumnHeader="True">
                        <ListBox.ItemsPanel>
                            <ItemsPanelTemplate>
                                <UniformGrid Columns="8" />
                            </ItemsPanelTemplate>
                        </ListBox.ItemsPanel>
//////////This is the manually added labels, which I need to sort by.
                        <Label Content="Sort" HorizontalAlignment="Center" VerticalAlignment="Top" Width="74" FontFamily="UnZialish" FontSize="12" FontWeight="Bold" Foreground="#FF07BCFF" HorizontalContentAlignment="Center"/>
                        <Label Content="Name" HorizontalAlignment="Center" VerticalAlignment="Top" Width="74" FontFamily="UnZialish" FontSize="12" FontWeight="Bold" Foreground="#FFCAA201" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
                        <Label Content="AC" HorizontalAlignment="Center" VerticalAlignment="Top" Width="74" FontFamily="UnZialish" FontSize="12" FontWeight="Bold" Foreground="#FFCAA201" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
                        <Label Content="Stealth" HorizontalAlignment="Center" VerticalAlignment="Top" Width="74" FontFamily="UnZialish" FontSize="12" FontWeight="Bold" Foreground="#FFCAA201" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
                        <Label Content="Cost" HorizontalAlignment="Center" VerticalAlignment="Top" Width="74" FontFamily="UnZialish" FontSize="12" FontWeight="Bold" Foreground="#FFCAA201" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
                        <Label Content="Weight" HorizontalAlignment="Center" VerticalAlignment="Top" Width="74" FontFamily="UnZialish" FontSize="12" FontWeight="Bold" Foreground="#FFCAA201" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
                        <Label Content="$" VerticalAlignment="Top" Width="74" FontFamily="Baskerville Old Face" FontSize="16" FontWeight="Bold" Foreground="#FFFFE500" HorizontalAlignment="Center" HorizontalContentAlignment="Center"/>
                        <Label x:Name="qty" Content="Qty" HorizontalAlignment="Center" VerticalAlignment="Top" Width="51" FontFamily="UnZialish" FontSize="12" FontWeight="Bold" Foreground="#FFFFE500" HorizontalContentAlignment="Center" Grid.IsSharedSizeScope="True" AutomationProperties.IsColumnHeader="True" AutomationProperties.Name="qty" MouseUp="qty_MouseUp"/>

//////////This is an example of 1 of the rows.
                        <Image x:Name="ImageShield" HorizontalAlignment="Center" Height="63" VerticalAlignment="Top" Width="74" Source="Images/i_shield.png" Stretch="UniformToFill" ToolTip="Right Click to + Left Click to -" MouseLeftButtonUp="ImageShield_MouseLeftButtonUp" MouseRightButtonUp="ImageShield_MouseRightButtonUp"/>
                        <Label Content="Shield" HorizontalAlignment="Center" VerticalAlignment="Top" Width="74" FontFamily="UnZialish" FontSize="10" FontWeight="Bold" Foreground="#FFADA5A5" Height="47" VerticalContentAlignment="Center" FontStretch="Condensed" HorizontalContentAlignment="Center"/>
                        <Label Content="2" HorizontalAlignment="Center" VerticalAlignment="Top" Width="74" FontFamily="UnZialish" FontSize="10" FontWeight="Normal" Foreground="#FFADA5A5" VerticalContentAlignment="Center" HorizontalContentAlignment="Center"/>
                        <Label Content="N/A" HorizontalAlignment="Center" VerticalAlignment="Top" Width="74" FontFamily="UnZialish" FontSize="10" FontWeight="Normal" Foreground="#FFADA5A5" VerticalContentAlignment="Center" HorizontalContentAlignment="Center"/>
                        <Label Content="10gp" HorizontalAlignment="Center" VerticalAlignment="Top" Width="74" FontFamily="UnZialish" FontSize="10" FontWeight="Normal" Foreground="#FFADA5A5" VerticalContentAlignment="Center" HorizontalContentAlignment="Center"/>
                        <Label Content="6lbs" HorizontalAlignment="Center" VerticalAlignment="Top" Width="74" FontFamily="UnZialish" FontSize="10" FontWeight="Normal" Foreground="#FFADA5A5" VerticalContentAlignment="Center" HorizontalContentAlignment="Center"/>
                        <Label Content="$" VerticalAlignment="Top" Width="74" FontFamily="Baskerville Old Face" FontSize="16" FontWeight="Bold" Foreground="#FFFFE500" HorizontalAlignment="Center" HorizontalContentAlignment="Center" MouseDown="Label_MouseDown"/>
                        <TextBox x:Name="qty1" Height="23" TextWrapping="Wrap" Text="0" Width="52" Background="{x:Null}" BorderBrush="{x:Null}" Foreground="#FF4DB425" MaxLength="7" FontSize="12" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,076
地点
挪威
编程经验
10+
最佳 底部