2016-11-13 5 views
0

Я использую двухстороннюю привязку WPF для свойства CLR, которое реализует INotifyPropertyChanged. set для объекта: internal, а get - public.WPF двусторонняя привязка с внутренним установщиком

К сожалению, я получаю следующее сообщение об ошибке:

System.Windows.Markup.XamlParseException was unhandled Message: An unhandled exception of type 'System.Windows.Markup.XamlParseException' occurred in PresentationFramework.dll Additional information: A TwoWay or OneWayToSource binding cannot work on the read-only property 'Name' of type 'MyType'.

Является ли это ожидаемое поведение? Я бы подумал, что внутренние сеттеры должны работать нормально ... Обратите внимание, что CLR-тип определен в другой сборке и отображается в текущей сборке с атрибутом [assembly: InternalsVisibleTo("MyAssembly")].

У кого-нибудь есть обходные пути/предложения? Объявляющая сборка - это библиотека классов, поэтому мне не нужно менять set на public.

+0

я нашел следующий вопрос на SO: http://stackoverflow.com/questions/ 4106721/internalsvisibleto-is-not-working-for-wpf-application? Rq = 1 Это оставляет мне без особых надежд - видимо, WPF не заботится об атрибуте «InternalsVisibleTo». Если у кого-то есть обходные пути, я все равно хотел бы знать. – Omaer

ответ

0

О, мой ... Я только что узнал, привязки WPF не работают с внутренними свойствами. О, Microsoft ... Что бы вы ни думали?


Update:

Вот что я понял до сих пор (Спасибо, @ Grx70):

  • WPF не является родной частью платформы .NET , это просто «плагин», который также может быть написан Microsoft. Вот почему он не может получить доступ к членам вашей сборки internal.
  • Microsoft может позволить WPF уважать атрибут [assembly: InternalsVisibleTo("XXX")], но на данный момент WPF игнорирует его, что, к сожалению, не оставляет его с помощью каких-либо простых обходных решений. Примечание: Я тестировал с использованием InternalVisibleTo - как подписанных, так и не подписанных, с PresentationFramework, PresentationCore и целым рядом других DLL без везения.
  • Единственным обходным решением, которое я могу сейчас придумать, является создание класса «Прокси», который может публиковать все необходимые члены. Это довольно PITA (у меня много классов, и я ненавижу кошмар обслуживания, который приходит с созданием равного количества классов «Proxy») - поэтому я мог бы изучить использование PostSharp, или Fody, или какого-то ткача для авто -создайте эти классы «прокси», если смогу.

Все самое лучшее для всех, кто сталкивается с этой проблемой.

+2

Я думаю, они думали: «Если вы создаете библиотеку классов и хотите разрешить сторонним библиотекам (например,« PresentationFramework ») обращаться к разработчикам свойств, вы не должны ** делать их« внутренними »_. – Grx70

+0

Итак ... Если я правильно прочитаю, могу ли я использовать InternalsVisibleTo, чтобы обеспечить прозрачность 'PresentationFramework' для свойств' internal'? – Omaer

+0

Я так не думаю.Я уверен, что требование для свойств источника привязки является общедоступным - это выбор дизайна, а не техничность, что еще больше показывает, что рассматриваемая библиотека классов не была предназначена для непосредственного использования с 'PresentationFramework' (или, по крайней мере, это не получилось хорошо). – Grx70

0

Вы можете создать свою собственную новую общественный wraper собственность и использовать геттер и сеттер его, чтобы взаимодействовать с вашим внутренним свойством

  internal string _SideTabHeader; 

      public string SideTabHeader 
      { 
       get { return _SideTabHeader; } 
       set 
{ 
    if(value<0) 
    { 
     do nothing 
    } 
    else 
    { 
     _SideTabHeader=value; 
    }; 
} 
     } 
+0

Как уже упоминалось, в вопросе меня не может изменить свойство на 'public' – Omaer

+0

Добавить новое общедоступное свойство wraper, и в качестве внутренней части его можно будет использовать внутреннее свойство –

+0

Вы предлагаете мне наследовать из исходного класса, а затем создать новое свойство для замены оригинала, но с публичными сеттерами? – Omaer

Смежные вопросы