Привязка ComboBox с использованием DoubleCollection, генерирующей ArgumentException - PullRequest
2 голосов
/ 07 февраля 2011

Я занимаюсь разработкой с использованием 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 только пару недель и пытаюсь отобразить ComboBox StrokeDashArrays, чтобы разрешить настройку линии.

Ответы [ 2 ]

1 голос
/ 10 февраля 2011

Привязка к свойству 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>

Никогдавыяснил, почему возникло исключение, хотя ...

0 голосов
/ 25 мая 2011

Я столкнулся с подобной проблемой при использовании DoubleCollections. Как правило, эта ошибка «Значение не попадает в ожидаемый диапазон» означает, что «два объекта имеют одинаковое имя в одном и том же родительском элементе»

При использовании DoubleCollection я обнаружил, что если я был уверен, что не использовал общий экземпляр, я не получил эту ошибку. Silverlight не понравилось, что я пытался использовать один и тот же экземпляр DoubleCollection для разных детей.

Дайте это попробовать!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...