0

ListBox と Label を持つ単純なウィンドウがあります。Label.Text を ListBox にバインドして、Label に表示されている選択されたものの次の listBox の Item になるようにしたいと思います。次のようなコンバーターでマルチバインディングを使用しようとしました。

 <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 プロパティが object[] ではなく、実際には 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

コード スニペットは正しいですか? SelectedValue ではなく SelectedIndex が必要なようです (質問を正しく理解していれば)。あれは、

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

計算されたインデックスがまだ範囲内にあることを確認するために、少なくともコンバーターでエラーチェックを行う必要があることに注意してください。

于 2012-04-18T21:06:33.550 に答える