WPf ListView: сохранение переупорядоченного порядка столбцов - PullRequest
5 голосов
/ 07 августа 2009

Для проекта WPF необходимо сохранить ширину и порядок столбцов ListView, потому что эти вещи пользователь может изменить. Я думаю, что это не проблема получить текущую ширину, но текущая позиция кажется немного сложной.

В WinForms было что-то вроде index и displayIndex, но я не вижу его в WPF. Как это сделать?

Кстати: сериализация всего элемента управления не вариант.

Edit:

Я нашел несколько примеров, используя свойство listView.columns. Но у меня нет такого свойства в моем listView

Мой код XAML выглядит так:

<ListView>
    <ListView.View>
        <GridView>
            <GridViewColumn>
            ....

Ответы [ 2 ]

4 голосов
/ 07 августа 2009

Мне удалось это сделать с помощью метода Move (…) из коллекции GridView Columns

Если у вас есть новый порядок хранения, вы можете попробовать:

((GridView)myListView.View).Columns.Move(originalIndex, newIndex);

Редактировать: это НЕ XAML, а код, который вы должны поместить в файл .xaml.cs

0 голосов
/ 22 июня 2017

Столбцы всегда находятся в том же порядке, что и коллекция gridView.Columns. Вы можете подключиться к событию gridView.CollectionChanged, чтобы реагировать на изменения, см. Также WPF Listview: Событие переупорядочения столбцов?

Я использую Behavior для этого. Существует свойство зависимости от поведения, которое связано с моим DataContext. Вам нужна ссылка на System.Windows.Interactivity, чтобы использовать интерактивность.

В моем DataContext есть ObservableCollection ColumnInfo, который я сохраняю в своей конфигурации при выходе из приложения:

public class ColumnInfo
    {
        public string HeaderName { get; set; }
        public int Width { get; set; }
        public int Index { get; set; }
    }

В вашем контроле добавьте пространство имен

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

И ListView - это что-то вроде

<ListView ItemsSource="{Binding SomeCollection}">
    <ListView.View>
        <GridView>
            <i:Interaction.Behaviors>
                <b:GridViewColumnBehavior Columns="{Binding Columns}" />
            </i:Interaction.Behaviors>
        </GridView>
    </ListView.View>
</ListView>

Поведение, которое я использую (его части)

public class GridViewColumnBehavior : Behavior<GridView>
{
    public ObservableCollection<ColumnInfo> Columns
    {
        get { return (ObservableCollection<ColumnInfo>)GetValue(ColumnsProperty); }
        set { SetValue(ColumnsProperty, value); }
    }

    public static readonly DependencyProperty ColumnsProperty =
        DependencyProperty.Register("Columns", typeof(ObservableCollection<ColumnInfo>), typeof(GridViewColumnBehavior), new PropertyMetadata(null, new PropertyChangedCallback(Columns_Changed)));

    private static void Columns_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var b = d as GridViewColumnBehavior;
        if (b == null) return;

        b.SetupColumns(e.NewValue as ObservableCollection<Column>);
    }

    public void SetupColumns(ObservableCollection<Column> oldColumns)
    {
        if(oldColumns != null)
        {
            oldColumns.CollectionChanged -= Columns_CollectionChanged;
        }

        if ((Columns?.Count ?? 0) == 0) return;

        AssociatedObject.Columns.Clear();

        foreach (var column in Columns.OrderBy(c => c.Index))
        {
            AddColumn(column);
        }

        Columns.CollectionChanged += Columns_CollectionChanged;
    }

    private void Columns_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        var lookup = AssociatedObject.Columns.Select((c, i) => new { Index = i, Element = c.Header.ToString() }).ToLookup(ci => ci.Element, ci => ci.Index);
        foreach (var c in Columns)
        {
            // store the index in the Model (ColumnInfo)
            c.Index = lookup[c.HeaderName].FirstOrDefault();
        }
    }
}

Наслаждайтесь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...