В настоящее время я играю с привязкой данных WPF, и я пришел к проблеме, которую я не понимаю. Поэтому я размещаю проблему здесь, возможно, у вас есть идея о том, что неправильно.Пользовательский класс привязки работает некорректно
Сначала я работаю с 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}" />
локального пространства имен, где реализуется класс MyBinding.
Теперь вот первое, что я не понимаю. VS2008 показывает следующее сообщение об ошибке в своем окне сообщения об ошибке (оригинальное сообщение на немецком языке, потому что я бег немецкой системы - я не имею сообщение об ошибке английского, поэтому я попытаюсь перевести)
Kein Konstruktor des MyBinding-Typs weist 1-Параметр auf.
(Нет конструктор типа MyBinding не берет 1 аргумент)
Althoug этой ошибки отображения проект компилируется нормально и класс 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}}" />
[...]
... и здесь я получаю следующее сообщение об ошибке при компиляции (ориги NAL на немецком языке, и я думаю, я также нашел оригинальное сообщение на английском языке):
Beim Analysieren Расширение етег Markup Würde für ден Typ «MS.Internal.Markup.MarkupExtensionParser + UnknownMarkupExtension» умереть unbekannte Eigenschaft «конвертер "gefunden. Zeile Позиция X Y.
(Неизвестное свойство 'Преобразователь' для типа 'MS.Internal.Markup.MarkupExtensionParser + UnknownMarkupExtension' встречается при разборе расширение разметки. Строка х позиция 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 в свой собственный класс привязки?
Спасибо! С уважением, René
Вы можете использовать атрибут ConstructorArgumentAttribute, чтобы не указывать явно «Path = ...». –