В настоящее время я работаю с привязкой данных WPF и столкнулся с проблемой, которую не понимаю. Итак, я опубликую проблему здесь, может быть, у вас есть и идея, что неправильно geoing.
Сначала: я работаю с Visual Studio 2008 под Windows Vista 32bit, проблема также присутствует в Windows 7 RC1 64bit, последние обновления / пакеты обновления установлены, кроме Vista, она все еще работает с SP1.
Вот проблема:
Я не могу установить ValueConverter в унаследованном классе Binding.
Вот мой класс привязки:
public class MyBinding : Binding
{
public MyBinding() : base() { }
public MyBinding(string path) : base(path) { }
}
Этот класс должен делать то же самое, что и исходный класс Binding, поскольку в настоящее время он не реализует никакой собственной логики. Я могу использовать этот класс в XAML следующим образом:
<TextBlock Text="{local:MyBinding SomeProperty}" />
local - это пространство имен, в котором реализован класс MyBinding.
Теперь вот первое, что я не понимаю. VS2008 показывает следующее сообщение об ошибке в своем окне ошибок (исходное сообщение на немецком языке, потому что я использую немецкую систему - у меня нет сообщения об ошибке на английском языке, поэтому я попытаюсь перевести)
Kein Konstruktor des MyBinding-Typs weist 1-Параметр auf. * 1018 *
(конструктор типа MyBinding не принимает 1 аргумент)
Несмотря на эту ошибку, проект компилируется очень хорошо, а класс MyBinding работает как положено. Почему Visual Studio не находит соответствующий конструктор (который, я бы сказал, правильно реализован)?
Я могу предотвратить появление этого сообщения, если я изменю код XAML на этот:
<TextBlock Text="{local:MyBinding Path=SomeProperty}" />
Сообщение об ошибке исчезло, потому что вызывается конструктор MyBinding по умолчанию, все работает нормально, хорошо ...
Теперь я хотел бы установить ValueConverter для привязки моего свойства, XAML выглядит так:
<Window.Resources>
<local:MyValueConverter x:Key="converter" />
</Window.Resources>
[...]
<TextBlock Text="{local:MyBinding Path=SomeProperty, Converter={StaticResource converter}}" />
[...]
..., и здесь я получаю следующую ошибку при компиляции (оригинал на немецком языке, и я думаю, что я также нашел оригинальное сообщение на английском):
Beim Analysieren einer Расширение разметки wurde für den Typ "MS.Internal.Markup.MarkupExtensionParser + UnknownMarkupExtension" die unbekannte Eigenschaft "Конвертер" gefunden. Zeile X Position Y.
(Неизвестное свойство 'Converter' для типа 'MS.Internal.Markup.MarkupExtensionParser + UnknownMarkupExtension', обнаруженное при анализе расширения разметки. Строка x, позиция Y)
Теперь я не могу больше компилировать, потому что VS не находит свойство конвертера (которое является публичным свойством исходного класса Binding).
Мне удалось заставить класс MyBinding работать с указанным конвертером, но только с небольшим взломом:
Я добавил следующее свойство в класс MyBinding:
public Type ConverterType
{
get { return Converter == null ? null : Converter.GetType(); }
set { Converter = value == null ? null : (IValueConverter)Activator.CreateInstance(value); }
}
... и XAML изменится на это:
<TextBlock Text="{local:MyBinding Path=SomeString, ConverterType=local:MyValueConverter}" />
Теперь мой проект компилируется и работает нормально. На самом деле, я думаю, это хорошее решение, потому что вам не нужно указывать конвертер как статический ресурс, а выражение привязки выглядит для меня немного более четко. Но в конце концов, это не может быть решением.
Так может кто-нибудь сказать мне, что я сделал не так? Почему я не могу установить свойство Converter в моем пользовательском классе Binding?
Спасибо!
С наилучшими пожеланиями,
Рене