对于需要保存ListView的宽度和列顺序的WPF项目,因为这些是用户可以更改的内容。我想获得当前宽度没问题,但目前的位置似乎有点困难。
在WinForms中有类似index和displayIndex的东西,但我在WPF中看不到它。 怎么做?
顺便说一句:序列化整个控件不是一种选择。
编辑:
我使用listView.columns属性找到了一些示例。但我的listView
中没有这样的属性我的XAML代码是这样的:
<ListView>
<ListView.View>
<GridView>
<GridViewColumn>
....
答案 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();
}
}
}
享受!