Основные проблемы макета с WPF ListView - PullRequest
0 голосов
/ 05 августа 2009

У меня есть простое представление списка:

<ListView Name="Container" >

</ListView>

1) Я бы хотел, чтобы элементы располагались по вертикали, пока не осталось места, а затем заполнили другой столбец (заголовок не нужен):

147
258
369

Я добавляю элементы программным способом, как это - но они отображаются горизонтально, а затем переходят к следующему ряду, когда заканчивается место:

foreach (Object obj in myCollection)
{
  UIElement control = CreateListViewItem(obj);
  this.Container.Items.Add(control);
}

2) Мне также нужно реализовать простую сортировку списка (переключение между / по убыванию).

Мне трудно найти ответы на этот, казалось бы, простой запрос!

Любая помощь приветствуется.

1 Ответ

2 голосов
/ 05 августа 2009

1) Если вы не хотите, чтобы заголовки использовали вместо ListBox с WrapPanel.

2) Почему вы добавляете UIElement в элемент управления элементами? Скорее всего, вы хотите использовать привязку данных. Особенно, если вы хотите отсортировать их. Как вы сортируете UIElements?

Ниже приведен код, который использует привязку данных. Надеюсь, что вы можете использовать его.

XAML:

<Window x:Class="ListViewTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition />
    </Grid.RowDefinitions>

    <Button Grid.Row="0" Content="Sort" Click="OnSort" />

    <ListBox Grid.Row="1" ItemsSource="{Binding Path=MyCollectionView}"
        ScrollViewer.HorizontalScrollBarVisibility="Auto" 
        ScrollViewer.VerticalScrollBarVisibility="Disabled">
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel Orientation="Vertical"/>
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Border BorderBrush="Red" BorderThickness="2" Margin="5">
                    <TextBlock Text="{Binding}" />
                </Border>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

</Grid>

Код:

using System.Collections;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;

namespace ListViewTest
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            List<object> myCollection = new List<object>();
            for (int i = 100; i <= 999; i++)
            {
                myCollection.Add(i);
            }

            MyCollectionView = new ListCollectionView(myCollection);
            MyCollectionView.CustomSort = _mySort;
            DataContext = this;
        }

        public ListCollectionView MyCollectionView { get; private set; }

        private void OnSort(object sender, RoutedEventArgs e)
        {
            _mySort.Ascending = !_mySort.Ascending;
            MyCollectionView.Refresh();
        }

        private MySort _mySort = new MySort();

        private class MySort : IComparer
        {
            public bool Ascending { get; set; }
            #region IComparer Members
            public int Compare(object x, object y)
            {
                return x.ToString().CompareTo(y.ToString()) * (Ascending ? -1 : 1);
            }    
            #endregion
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...