0

我有一个带有 ListBox 和标签的简单窗口。我想以这样的方式将 Label.Text 绑定到 ListBox,使其成为标签中显示的所选项目之后的列表框的下一个项目。我尝试将多重绑定与这样的转换器一起使用:

 <Label>
      <MultiBinding Converter="{StaticResource myConverter}">
            <Binding ElementName="lbox" Path="Items"/>
            <Binding ElementName="lbox" Path="SelectedIndex"/>
      </MultiBinding>-->
 </Label>    

public class MyConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        object[] items = values[0] as object[];
        int index = (int)(values[1]) + 1;
        return (items[index]).ToString();

    }
  .....
}

但它不起作用。问题是我无法获取 ListBoxItems 数组。请问你能帮帮我吗?

4

2 回答 2

2

好的,这里有几件事是错误的。

  1. 在尝试从数组中获取某些内容之前,您没有检查索引值。如果没有选择会发生什么,或者如果他们选择了最后一行会发生什么?

  2. 调用列表框项的 ToString() 方法将为您提供“System.Windows.Controls.ListBoxItem: Item's Text”

  3. 最后,也许最直接回答您的问题的是,Items 属性不是一个对象 [],而是一个 ItemsCollection。您的代码应如下所示:

    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        System.Windows.Controls.ItemCollection items = values[0] 
                            as System.Windows.Controls.ItemCollection;
    
        int index = (int)(values[1]) + 1;
    
        ...
    }
    
于 2012-04-19T07:04:20.677 回答
1

你的代码片段正确吗?在我看来,您想要 SelectedIndex 而不是 SelectedValue (如果我正确理解了您的问题)。那是,

 <Label>
      <MultiBinding Converter="{StaticResource myConverter}">
            <Binding ElementName="lbox" Path="Items"/>
            <Binding ElementName="lbox" Path="SelectedIndex"/>
      </MultiBinding>
 </Label> 

请注意,至少您应该在转换器中进行一些错误检查,以检查您的计算索引是否仍在范围内。

于 2012-04-18T21:06:33.550 回答