WPF:资源" IndexConverter"无法解决

时间:2014-09-03 00:47:39

标签: c# wpf listview data-binding resources

我试图将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,这绝对是我放置它的地方。

1 个答案:

答案 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函数重新排列索引。