ComboBox绑定使用DoubleCollection抛出ArgumentException

时间:2011-02-07 16:31:24

标签: silverlight binding

我正在使用Silverlight 3开发,我有以下xaml:

<Application.Resources>        
    <DataTemplate x:Key="LineCombo">
        <StackPanel Orientation="Horizontal" Margin="2">
            <Line X1="0" Y1="0" X2="50" Y2="0" VerticalAlignment="Center" Stroke="Blue" StrokeThickness="1" StrokeDashArray="{Binding}" />               
        </StackPanel>
    </DataTemplate>
</Application.Resources>

<StackPanel>
    <ComboBox x:Name="ComboBoxTest1" ItemTemplate="{StaticResource LineCombo}" Width="200" Height="30">
    </ComboBox>
    <ComboBox x:Name="ComboBoxTest2" ItemTemplate="{StaticResource LineCombo}" Width="200" Height="30">
    </ComboBox>           
</StackPanel>

代码背后:

    public ObservableCollection<DoubleCollection> strokeDashArrays1 = new ObservableCollection<DoubleCollection>();
    public ObservableCollection<Double[]> strokeDashArrays2 = new ObservableCollection<Double[]>();

    public MainPage()
    {
        InitializeComponent();

        strokeDashArrays1.Add(new DoubleCollection { 2, 4 });
        strokeDashArrays1.Add(new DoubleCollection { 3, 6 });
        strokeDashArrays1.Add(new DoubleCollection { 4, 8 });

        strokeDashArrays2.Add(new double[] { 2, 4 });
        strokeDashArrays2.Add(new double[] { 3, 6 });
        strokeDashArrays2.Add(new double[] { 4, 8 });

        ComboBoxTest1.ItemsSource = strokeDashArrays1;
        ComboBoxTest2.ItemsSource = strokeDashArrays2;            

    }

从ComboBoxTest1中选择一个项会抛出ArgumentException:

  

“价值不属于   预期范围“。

选择项目时,显示OK和ComboBoxTest2都正常。

导致此行为的原因是什么?

我只使用了Silverlight几周,并且正在尝试显示一个StrokeDashArrays的ComboBox以允许行自定义。

2 个答案:

答案 0 :(得分:1)

绑定到StrokeDashArray属性时使用一串值,所以我通过实现以下IValueConverter解决了这个问题:

public class DoubleCollectionConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        DoubleCollection doubleCollection = (DoubleCollection)value;
        return string.Join(",", doubleCollection.Select(x => x.ToString()).ToArray());
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

像这样使用:

<src:DoubleCollectionConverter x:Key="doubleCollectionConverter"/>

 <DataTemplate x:Key="LineCombo">
    <StackPanel Orientation="Horizontal" Margin="2">
        <Line X1="0" Y1="0" X2="50" Y2="0" VerticalAlignment="Center" Stroke="Blue" StrokeThickness="1" StrokeDashArray="{Binding Converter={StaticResource doubleCollectionConverter}}" />
    </StackPanel>
 </DataTemplate>

永远不知道为什么会抛出异常......

答案 1 :(得分:0)

我使用DoubleCollections遇到了类似的问题。通常,此“值不在预期范围内”错误表示“两个对象在同一父级中具有相同的名称。”

当使用DoubleCollection时,我发现如果我确定我没有使用常见实例,我没有收到此错误。 Silverlight不喜欢我尝试在不同的孩子之间使用相同的DoubleCollection实例。

试一试!