代码之家  ›  专栏  ›  技术社区  ›  TalkingCode

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

  •  5
  • TalkingCode  · 技术社区  · 15 年前

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

    在WinForms中有类似index和displayIndex的内容,但在WPF中看不到。 怎么做的?

    BTW:序列化整个控件不是一个选项。

    编辑:

    我发现了一些使用listView.columns属性的示例。但我的列表视图中没有这样的属性

    我的XAML代码如下:

    <ListView>
        <ListView.View>
            <GridView>
                <GridViewColumn>
                ....
    
    2 回复  |  直到 15 年前
        1
  •  4
  •   teynon    10 年前

    我使用GridView的Columns集合的Move()方法成功地做到了这一点

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

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

    编辑:这不是XAML,但您应该将代码放入.XAML.cs文件中

        2
  •  0
  •   Dennis Kuypers    7 年前

    列的顺序始终与gridView.Columns集合的顺序相同。您可以挂接到gridView.CollectionChanged事件以响应更改,另请参见 WPF Listview : Column reorder event?

    我用的是 Behavior 做这个。在绑定到我的数据上下文的行为上有一个依赖属性。你需要参考一下 System.Windows.Interactivity 使用交互性。

    在我的DATACONTRONT中,有一个存储在我的应用程序出口配置中的CabnNoFo的观察表:

    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 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();
            }
        }
    }
    

    享受吧!