数据绑定selectedindex + 1

时间:2010-07-28 15:27:26

标签: wpf binding

我想绑定一个文本框,以显示所选项目下方项目的文本。

示例:

第1项 - 文本=行数字一 第2项 - 文本=第二行第二 第3项 - 文本=第三行

我选择第2项

输出

文本框1 - 文本=第二行(这很容易设置绑定到selecteditem)
文本框2 - 文本=第三行

我在想一个selectedindex + 1的自定义xpath,但这似乎不起作用

1 个答案:

答案 0 :(得分:1)

首次尝试失败 - 见下文

您需要实现IValueConverter并将其设置为绑定的Converter属性。

创建一个继承自IValueConverter的类,并在Convert方法中,将value参数转换为ListBox(因为您将绑定TextBox本身ListBox,让转换器将其转换为有意义的内容。

然后获取对ListBox的{​​{1}}属性的引用。

您想从方法中返回SelectedIndex

您可以保留listBox.Items[selectedIndex + 1]方法未实现。

您还必须处理选择ConvertBack中最后一项的情况,因为索引+ 1将超出范围。也许你想要归还第一个项目;也许您想要返回ListBoxnull

更新:自定义ListBox

根据要求,这是一个使用自定义ListBox以及名为“ItemAfterSelected”的附加[Dependency]属性的示例。

首先,派生控件的代码:

string.Empty

这是一个示例窗口,显示如何使用和绑定到控件(您可以将其放入应用程序并运行它以查看它的运行情况。)

using System.Windows;
using System.Windows.Controls;

namespace WpfApplication1
{
     public class PlusOneListBox : ListBox
     {
          public PlusOneListBox()
          {
                SelectionMode = SelectionMode.Single;
          }

          public object ItemAfterSelected
          {
                get { return GetValue(ItemAfterSelectedProperty); }
                set { SetValue(ItemAfterSelectedProperty, value); }
          }
          public static readonly DependencyProperty ItemAfterSelectedProperty = DependencyProperty.Register(
                "ItemAfterSelected", typeof (object), typeof (PlusOneListBox));

          protected override void OnSelectionChanged(SelectionChangedEventArgs e)
          {
                var newly_selected = e.AddedItems;
                if (newly_selected == null) ItemAfterSelected = null;
                else
                {
                     var last_index = Items.Count - 1;
                     var index = Items.IndexOf(newly_selected[0]);
                     ItemAfterSelected = index < last_index
                                                     ? Items[index + 1]
                                                     : null;
                }
                base.OnSelectionChanged(e);
          }
     }
}