2012-04-18 72 views
0

我有一个简单的窗口与列表框和标签。我想将Label.Text绑定到ListBox,使其成为Label中显示的所选项之后的下一个ListBox项。 我试图用multibinding用这样的转换器:WPF绑定到一个ListBox.Items

<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的数组。请你能帮助我吗?

+0

尝试使用SelectedIndex的,而不是在的SelectedItem你MultiBinding。 (请注意,即使这个代码工作,这个代码也非常脆弱。) – Alan 2012-04-18 21:03:43

回答

2

好吧,这里有几个错误。

  1. 在尝试从阵列中取出某些东西之前,您没有检查索引值。如果没有选择会发生什么,或者如果他们选择最后一行会发生什么?

  2. 调用列表框项的ToString()方法会给你“System.Windows.Controls.ListBoxItem:项目的文本”

  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; 
    
        ... 
    } 
    
1

您的代码片段正确吗?它在我看来你想SelectedIndex而不是SelectedValue(如果我已经正确理解你的问题)。 也就是说,

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

注意,至少你应该在你的转换器的一些错误检查,以检查你的计算指标仍处于范围。

+0

你是对的,我将SelectedItem和SelectedIndex混合起来。但这只是代码中的一个错误,并不能解决问题。问题是我无法获得listboxItes数组。对象[]项目始终为空值。 – 2012-04-19 06:15:16

+0

我想说你应该看看@ExitMusic给出的答案,这个答案在帮助你非常全面。 – 2012-04-19 08:35:34