WPf ListView:保存重新排序的列顺序

时间:2009-08-07 07:37:21

标签: wpf listview

对于需要保存ListView的宽度和列顺序的WPF项目,因为这些是用户可以更改的内容。我想获得当前宽度没问题,但目前的位置似乎有点困难。

在WinForms中有类似index和displayIndex的东西,但我在WPF中看不到它。 怎么做?

顺便说一句:序列化整个控件不是一种选择。

编辑:

我使用listView.columns属性找到了一些示例。但我的listView

中没有这样的属性

我的XAML代码是这样的:

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

2 个答案:

答案 0 :(得分:4)

我设法使用GridView的Columns集合的Move(...)方法

如果以某种方式存储新订单,您可以尝试:

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

编辑:这不是XAML,而是应该放在.xaml.cs文件中的代码

答案 1 :(得分:0)

列始终与gridView.Columns集合相同。您可以挂钩到gridView.CollectionChanged事件以响应更改,另请参阅https://stackoverflow.com/a/44686455/5009287

我使用Behavior来执行此操作。绑定到我的DataContext的Behavior上有一个依赖项属性。您需要引用System.Windows.Interactivity才能使用交互性。

在我的DataContext上有一个ObservableCollection of 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();
        }
    }
}

享受!