我试图将ListView的索引绑定到列表中的列以供显示。
最后,我还希望能够使用"删除"删除条目。在行的DataTemplate中按钮,但让绑定工作是第一步。
这(或某些变体)似乎是最受欢迎的答案之一: How to display row numbers in a ListView?
这是我到目前为止所拥有的: XAML:
<GridViewColumn Header="Index" DisplayMemberBinding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}, Converter={StaticResource IndexConverter}}">
</GridViewColumn>
C#:
public class IndexConverter : IValueConverter
{
public object Convert(object value, Type TargetType, object parameter)
{
ListViewItem item = (ListViewItem)value;
ListView listView = ItemsControl.ItemsControlFromItemContainer(item) as ListView;
int index = listView.ItemContainerGenerator.IndexFromContainer(item);
return index.ToString();
}
public object ConvertBack(object value, Type targetType, object parameter)
{
throw new NotImplementedException();
}
}
我把这个函数放在我的应用程序视图的CS文件中。
它告诉我它无法解析IndexConverter的资源。我觉得这可能是一个快速解决方案,而且我要么把功能放在错误的位置,要么在我添加资源时缺少一些代码。但是,链接中的解决方案并没有清除它。
更新:
根据sa_ddam213的建议,我编辑了我的App.xaml文件,其中包括:
<Application x:Class="WpfApplication1.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:myConverters="clr-namespace:WpfApplication1.Views"
StartupUri="MainWindow.xaml">
<Application.Resources>
<ResourceDictionary Source="Themes/DarkTheme.xaml" />
<myConverters:IndexConverter x:Key="IndexConverter" />
</Application.Resources>
</Application>
我现在收到的错误是资源只能设置一次。注释掉DarkTheme可以消除这个错误,但是它说在WpfApplication1.Views命名空间中不存在IndexConverter,这绝对是我放置它的地方。
答案 0 :(得分:-1)
我最近在最近的一个项目中完成了这项任务。我有一个ListView,我希望用户能够重新订购项目(使用箭头键和/或按钮上下移动条目)。
我在集合的类中添加了一个名为SortOrder的新成员,我为每个添加的新项目分配了一个唯一值。然后我编写了一个函数来根据SortOrder对集合项进行排序,以及将项目向上或向下移动一个空间的函数。
然后,SortOrder属性可以绑定并显示在列中,因为它是类的成员。
这并不是我在原始项目中尝试做的事情,因为我基本上用我自己的系统绕过了实际的集合索引,但就用户而言,它确实起到了作用。
public class ViewTest : BindableBase
{
public long SortOrder { get; set; }
}
private ObservableCollection<ViewTest> testViewList = new ObservableCollection<ViewTest>();
public ObservableCollection<ViewTest> TestViewList
{
get { return this.testViewList; }
private set { this.SetProperty<ObservableCollection<ViewTest>>(ref this.testViewList, value); }
}
<ListView ItemsSource="{Binding Path=TestViewList, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<ListView.View>
<GridView>
<GridViewColumn Header="Order" DisplayMemberBinding="{Binding Path=SortOrder}" />
</GridView>
</ListView.View>
</ListView>
private void AddTest(string test)
{
ViewTest newTest = new ViewTest();
newTest.SortOrder = this.GetHighestSortOrder(this.TestViewList) + 1;
this.TestViewList.Add(newTest);
}
private int GetHighestSortOrder(ObservableCollection<ViewTest> testList)
{
int highest = 0;
foreach (ViewTest test in testList)
{
if (test.SortOrder > highest)
{
highest = Convert.ToInt32(test.SortOrder);
}
}
return highest;
}
private ObservableCollection<ViewTest> SortTests(ObservableCollection<ViewTest> testList)
{
ObservableCollection<ViewTest> sortedList = new ObservableCollection<ViewTest>();
while (testList.Count > 0)
{
int index = 0;
int lowest = 0;
while (index < testList.Count)
{
if (testList[index].SortOrder < testList[lowest].SortOrder)
{
lowest = index;
}
index += 1;
}
sortedList.Add(testList[lowest]);
testList.RemoveAt(lowest);
}
return sortedList;
}
上下移动项目的功能只是交换两个SortOrder值,然后调用SortOrder函数重新排列索引。