在ListBox中手动添加控件

时间:2015-05-14 17:40:33

标签: c# wpf sorting listbox controls

我有一个ListBox:

<ListBox Name="LbFrequentColumnItems" Grid.Row="1" MinHeight="0"></ListBox>

我在上面的列表框中添加了许多图像按钮,如下所示:

ImageButton b = new ImageButton();
b.Content = d.DisplayName;              
b.Click += new RoutedEventHandler(OptionalColumnItems_Click);
LbFrequentColumnItems.Items.Add(b);

点击按钮我需要按照内容的排序顺序显示我的所有图像按钮。

我可以通过复制所有列表然后排序并再次添加按钮来实现。

但是在列表框上有没有直接的方法或任何方法来执行它?

我尝试了如下所示的内容,但它无法正常工作,因为我没有任何属性绑定:

LbFrequentColumnItems
    .Items
    .SortDescriptions
    .Add(
         new System.ComponentModel.SortDescription("",
            System.ComponentModel.ListSortDirection.Ascending));

1 个答案:

答案 0 :(得分:2)

您可以按Content属性对其进行排序:

private void Button_Click(object sender, RoutedEventArgs e)
{
    LbFrequentColumnItems
        .Items
        .SortDescriptions
        .Add(new SortDescription("Content", ListSortDirection.Ascending));
}

它不会抛出InvalidOperationException,因为System.String实现了IComparable接口,(Image)Button没有实现。

演示:

public MainWindow()
{
    InitializeComponent();

    var names = Enumerable
        .Range(1, 10)
        .OrderBy(_ => Guid.NewGuid())
        .Select(i =>
            i.ToString());

    foreach (var button in this.CreateNewButtons(names))
    {
        LbFrequentColumnItems.Items.Add(button);                
    }
}

private IEnumerable<Button> CreateNewButtons(IEnumerable<String> names)
{
    foreach (var name in names)
    {
        Button b = new Button();
        b.Content = name;
        b.Click += new RoutedEventHandler(OptionalColumnItems_Click);

        yield return b;
    }
}

private void OptionalColumnItems_Click(object sender, RoutedEventArgs e)
{
    throw new NotImplementedException();
}

的Xaml:

    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <ListBox Name="LbFrequentColumnItems" Grid.Row="0" MinHeight="0"></ListBox>
    <Button Grid.Row="1" Content="Reorder" Click="Button_Click"/>

P.S。:以同样的方式,您可以将Button DataContext属性设置为实现IComparable并按DataContext排序的某个特定数据对象 - new SortDescription("DataContext", ListSortDirection.Ascending)

P.S.1:虽然不禁止手动添加按钮,但使用WPF的高级数据绑定和模板功能要好得多。经过一些初步投资,他们将使应用程序更容易开发和修改。