2009-06-19 2 views
7

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

+0

Вы можете использовать атрибут ConstructorArgumentAttribute, чтобы не указывать явно «Path = ...». –

ответ

2

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

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

В качестве альтернативы, вы можете попробовать расширение разметки, как показано here.

0

Благодарим за отзыв!

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

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

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

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

Имейте славный уикэнд!

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

6

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

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

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

0

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