我有一个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));
答案 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的高级数据绑定和模板功能要好得多。经过一些初步投资,他们将使应用程序更容易开发和修改。