【问题标题】:WPf ListView : Save reorderd column orderWPf ListView:保存重新排序的列顺序
【发布时间】:2017-06-22 05:22:48
【问题描述】:

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

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

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

编辑:

我使用 listView.columns 属性找到了一些示例。但是我的 listView 中没有这样的属性

我的 XAML 代码是这样的:

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

【问题讨论】:

    标签: wpf listview


    【解决方案1】:

    我使用 GridView 的 Columns 集合的 Move(…) 方法设法做到了这一点

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

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

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

    【讨论】:

    • 在我从磁盘加载列后,将列按新顺序排列似乎很棒。但是如何从 ListView 中获取当前订单呢?
    • 好吧,我猜当前的顺序是列的默认顺序,正如设计的那样。如果这是正确的,您应该知道哪一列在哪里。
    【解决方案2】:

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

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

    在我的 DataContext 上有一个 ColumnInfo 的 ObservableCollection,我在应用程序退出时存储在我的配置中:

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

    享受吧!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-03
      • 1970-01-01
      • 1970-01-01
      • 2019-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多