WPF TypeConversionAttribute для коллекции DP - PullRequest
2 голосов
/ 01 марта 2011

У меня есть ObservableCollection как свойство зависимости (скажем, Points) в пользовательском элементе управления.

Я хочу инициализировать это так

<MyControl Points="1,1, 2,2"/>

Как мне определить и создать преобразователь типов для конкретного DP?

Я знаю, что есть специальный класс для сбора точек со встроенным преобразователем типов, но я не могу его использовать.

Ответы [ 2 ]

3 голосов
/ 01 марта 2011

Вы можете указать TypeConverter в оболочке свойства CLR для своего свойства зависимости.Вот так:

public class MyControl : Control 
{
    [TypeConverter(typeof(MyStringToPointCollectionConverter))]
    public ObservableCollection<Point> Points {
        get { return (ObservableCollection<Point>)GetValue(Points yProperty); }
        set { SetValue(Points Property, value); }
    }
    ...
}

И конвертер будет выглядеть примерно так:

public class MyStringToPointCollectionConverter : TypeConverter {
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) {
        if (sourceType == typeof(string)) {
            return true;
        }

        return false;
    }

    public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) {
        var stringValue = value as string;

        if (stringValue != null) {
            var result = new ObservableCollection<Point>();

            // Here goes the logic of converting the given string to the list of points

            return result;
        }

        return null;
    }
}
0 голосов
/ 01 марта 2011

хороший вопрос. Есть способ сделать это - изменить DP, чтобы ваши Очки имели тип объекта / строки (чтобы избежать недопустимого исключения приведения) и выполнить преобразование в обработчике события изменения DP. В конце концов, вам нечего терять - система DP - это не просто безопасная структура типов.

Это сработает. Я вполне могу видеть JSON как формат ваших сериализованных данных.

Другим подходом будет введение более высокого уровня абстракции поверх вашей наблюдаемой коллекции. Как правило, это ослабляет давление на XAML.

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