Как Xaml создает преобразование строки в значение BitmapImage при привязке к Image.Source?

Я создаю -Image.SourceString привязка в коде, как:

var newBinding = new System.Windows.Data.Binding()
  {
    Path = new PropertyPath("MyImageUrl")
  };
BindingOperations.SetBinding(attachedObject, Image.SourceProperty, newBinding);

Этот подход хорошо работает, например, для -TextBlock.TextPropertyString привязки, но для -Image.SourceString Я бы идеально хотелBinding автоматически вставить преобразование для меня - так же, как это делает привязка Xaml, когда я использую:


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

Есть ли способ получить новыйBinding автоматически добавить егос собственной строки->BitmapImageValueConverter во время оценки связывания на основе кода?

 Alaa Masoud25 мая 2013 г., 22:14
Только что попробовал на WP7 и он там на самом деле не работал, но работает на WP8
 Stuart25 мая 2013 г., 22:13
Он возвращает http: // URL для placekitten.com :) Я работаю в библиотеке на основе wp7. Это'здесь уже поздно ... завтра попробую заново ...
 Stuart26 мая 2013 г., 19:13
@AlaaMasoud Хорошо, яТеперь я вижу результаты последовательно в любом коде, созданном для wp7 (даже если он 's работает на wp8) - так что, думаю, это что-то сломанное в wp7. Откроется новый вопрос, чтобы увидеть, если кто-нибудь знает разницу и легкий способ обойти это.
 Stuart25 мая 2013 г., 21:56
Нет - если я создаю эту точную привязку в коде, она не работает для строки.
 Alaa Masoud25 мая 2013 г., 22:10
Я пробовал на wp8. Это может звучать глупо, но можете ли вы дважды проверить, что ваше свойство возвращает правильную строку пути изображения?
 Alaa Masoud25 мая 2013 г., 21:39
Я не уверен, правильно ли я понимаю. Какой тип свойства (MyImageUrl) вы хотите связать? Потому что код, который вы дали, эквивалентен выполнению <Источник изображения = "{Binding MyImageUrl "} /> в Xaml. Свойство может быть строкой, Uri или ImageSource и должно работать во всех случаях.
 Stuart25 мая 2013 г., 22:08
Интересно - у меня не работает эмулятор wp7 или телефон wp8. Что вы пробовали? WP7? КР8? Другой?
 Alaa Masoud25 мая 2013 г., 22:03
хммм. Я только что попробовал, работает нормально. Вы получаете какие-либо исключения или изображение просто нет шоу?

Ответы на вопрос(1)

Решение Вопроса

System.Windows.Media.ImageSource имеетTypeConverterAttribute

[TypeConverter(typeof(ImageSourceConverter))]

Привязка будет искать это и использовать конвертер автоматически.

Если вы посмотрите наImageSourceConverter Вы можете увидеть, из каких типов он может конвертировать:

if (sourceType == typeof(string) || 
    sourceType == typeof(Stream) || 
    sourceType == typeof(Uri) || 
    sourceType == typeof(byte[]))
{
    return true;
}

Чтобы имитировать этот процесс, вы должны добавитьTypeConverterAttribute на типе имущества, с которым связано.

Вы можете сделать это, 1. контролируя тип, или 2. используйтеTypeDescriptor во время выполнения, чтобы добавить атрибут. Там's вопрос об этомВот.

 Stuart26 мая 2013 г., 19:11
Благодарю. Я думаю, что проблема, которую яНа Wp7 что-то ведет себя по-другому ... На Wp8 это, кажется, работает отлично.

Ваш ответ на вопрос