Пользовательский класс привязки работает неправильно - PullRequest
7 голосов
/ 19 июня 2009

В настоящее время я работаю с привязкой данных 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?

Спасибо! С наилучшими пожеланиями, Рене

Ответы [ 4 ]

6 голосов
/ 22 июня 2009

после некоторого дальнейшего тестирования с расширениями разметки эта проблема проходила снова и снова, и после некоторого поиска в Google, я думаю, я нашел подтверждение, что это ошибка в конструкторе Visual Studio. Все, кому это интересно, должны взглянуть на

http://www.hardcodet.net/2008/04/nested-markup-extension-bug

С уважением, Рене

2 голосов
/ 19 июня 2009

Наследование от Binding, вероятно, не лучшее решение. Если вы просто хотите обойти объявление конвертера как статический ресурс, попробуйте создать синглтон вашего конвертера и использовать его так:

Text="{Binding Path=Foo, Converter={x:Static local:MyConverter.Converter}}"

Кроме того, вы можете попробовать расширение разметки, как показано здесь .

0 голосов
/ 14 октября 2015

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

0 голосов
/ 19 июня 2009

Спасибо за ваш ответ!

В общем, у меня нет проблем с синтаксисом выражения привязки и объявлением конвертера перед его использованием. То, что я написал выше, является просто хорошим результатом обхода моей основной проблемы. Я хочу создать свой собственный класс Binding и передать в него свой собственный конвертер так же, как я сделал бы это с оригинальным классом Binding.

Я просто хочу понять сообщение об ошибке, которое мне преподносит VS. Я думаю, у этого должна быть причина: я делаю что-то не так или в Visual Studio / WPF есть ошибка.

До этого дня я был почти уверен, что проблема заключается в том, чтобы сидеть перед компьютером. Но я разместил этот вопрос в двух других группах пользователей (также на MSDN на форуме для WPF). До сих пор вы единственный человек, который отвечает. И вот я пришел к мысли, что это также может быть проблемой с визуальной студией ... Я не знаю.

Опять же, большое спасибо, я посмотрю поближе на странице, которую вы опубликовали (в настоящее время только короткую).

Хороших выходных!

С наилучшими пожеланиями, Рене

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