1

我有一个不适用于 TextBox.Text 的 MultiBinding。我有相同的代码正确绑定到扩展 WPF Toolkit的 IntegerUpDown 的值。

它正在通过一个 IMultiValueConverter,它接受绑定的 POCO 和它所属的列表框(它显示列表框中项目的顺序)

这是代码:

<!--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),属性可能具有从一种(或多种)类型转换为属性所需类型的类型转换器。例如,当你写:

<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 回答