1

TextBox.Textで機能していないMultiBindingがあります。拡張WPFツールキットのIntegerUpDownの値に適切にバインドされているのと同じコードがあります。

バインドされたPOCOとその一部であるリストボックスを取得するIMultiValueConverterを通過します(リストボックス内のアイテムの順序を表示しています)

コードは次のとおりです。

<!--works-->
<wpf:IntegerUpDown ValueChanged="orderChanged" x:Name="tripOrder">
    <wpf:IntegerUpDown.Value>
        <MultiBinding Converter="{StaticResource listBoxIndexConverter}" Mode="OneWay">
            <Binding />
            <Binding ElementName="listTrips" />
        </MultiBinding>
    </wpf:IntegerUpDown.Value>
</wpf:IntegerUpDown>
<!--doesn't work-->
<TextBox x:Name="tripOrder2">
    <TextBox.Text>
        <MultiBinding Converter="{StaticResource listBoxIndexConverter}" Mode="OneWay">
            <Binding />
            <Binding ElementName="listTrips" />
        </MultiBinding>
    </TextBox.Text>
</TextBox>

結果は次のとおりです。

結果

関連性があるとは思いませんが、念のため、変換を実行するクラスは次のとおりです。

    public class ListBoxIndexConverter : IMultiValueConverter
    {

    #region IMultiValueConverter Members

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var trip = values[0] as TripBase;

        if (trip == null)
        {
            return null;
        }

        var lb = values[1] as CheckListBox;
        if (lb == null)
        {
            return null;
        }

        //make it 1 based
        return lb.Items.IndexOf(trip) + 1;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}
4

2 に答える 2

2

コンバーターは、プロパティが期待するタイプを返す必要があります。その理由は、プロパティを通常使用する場合(つまり、プロパティなしでBinding)、プロパティには、1つのタイプ(またはそれ以上)からプロパティに必要なタイプに変換するタイプコンバーターが含まれる場合があるためです。たとえば、次のように記述します。

<ColumnDefinition Width="Auto"/>

文字列「Auto」を次のように変換するコンバーターがあります。

new GridLength(1, GridUnitType.Auto)

バインディングを使用する場合、コンバーターは正しいタイプを返す必要があるため、このメカニズムはバイパスされます。

したがって、問題を修正するには、コンバーターの返却時に次のようにします。

return (lb.Items.IndexOf(trip) + 1).ToString();

これで修正されますTextBox

さて、IntegerUpDown。それは実際にを受け取ることを期待しているように聞こえます、intそして文字列を返すことはそれを壊します。したがって、ここでも、コンバーターのリターンを変更します。

if (targetType == typeof(int))
{
    return lb.Items.IndexOf(trip) + 1;
}
else if (targetType == typeof(string))
{
    return (lb.Items.IndexOf(trip) + 1).ToString();
}
else
{
    throw new NotImplementedException(String.Format("Can not convert to type {0}", targetType.ToString()));
}
于 2012-05-08T16:39:07.357 に答える
0

listTripsリストボックスで選択した値が変更されても、は変更されないため、バインディングは機能しません。変更されるのはですlistTrips.SelectedItemので、それにバインドする必要があります。

<Binding Path="SelectedItem" ElementName="listTrips"/>

実は、なぜ最初の例でうまくいくのだろうか。

于 2012-05-08T16:05:45.367 に答える