WPF двусторонняя привязка с внутренним сеттером
Я использую двустороннее связывание WPF для свойства CLR, которое реализует INotifyPropertyChanged. set
для собственности internal
, в то время как get
является public
,
К сожалению, я получаю следующую ошибку:
System.Windows.Markup.XamlParseException не обработано. Сообщение: необработанное исключение типа "System.Windows.Markup.XamlParseException" возникло в PresentationFramework.dll. Дополнительная информация: привязка TwoWay или OneWayToSource не может работать с доступным только для чтения свойством "Name" введите "MyType".
Это ожидаемое поведение? Я бы подумал, что внутренние сеттеры должны работать очень хорошо... Обратите внимание, что тип CLR определен в другой сборке и виден в текущей сборке с [assembly: InternalsVisibleTo("MyAssembly")]
приписывать.
У кого-нибудь есть обходные пути / предложения? Декларирующая сборка - это библиотека классов, поэтому я не могу изменить set
в public
,
2 ответа
Это очень поздно и не решает первоначальный вопрос, но, поскольку это очень связано, это может помочь кому-то еще с очень похожей проблемой...
Если ваше внутреннее свойство имеет тип Enum, иначе пропустите
В моем случае я пытался выполнить привязку WPF xaml к свойству типа, унаследованного от службы WCF. Самый простой способ решить этот простой случай - использовать int.
public Dictionary<int, string> ProductsList => EnumExtensions.ProductsList;
public int ProductType
{
get { return (int)_DeliveryProduct.ProductType; }
set
{
if (value.Equals(ProductType)) return;
_DeliveryProduct.ProductType = (ProductEnum)value;
RaisePropertyChanged(() => ProductType);
}
}
_DeliveryProduct - это моя ссылка на мой объект домена, для которого свойство ProductType является перечислением, но в моей модели просмотра это свойство является int.... Обратите внимание, что ProductEnum создается автоматически из API и не может быть изменен на общедоступный.
internal static Dictionary<int, string> ProductsList => new Dictionary<int, string>
{
{(int)ProductEnum.Regular, ProductEnum.Regular.GetDisplayName()},
{(int)ProductEnum.Intermediate, ProductEnum.Intermediate.GetDisplayName()},
{(int)ProductEnum.Super, ProductEnum.Super.GetDisplayName()},
{(int)ProductEnum.Diesel, ProductEnum.Diesel.GetDisplayName()}
};
Вы можете создать свое собственное НОВОЕ общедоступное свойство-обертку и использовать его для получения и установки для взаимодействия со своим внутренним свойством.
internal string _SideTabHeader;
public string SideTabHeader
{
get { return _SideTabHeader; }
set
{
if( value<0)
{
do nothing
}
else
{
_SideTabHeader=value;
};
}
}
О боже... Я только что узнал, что привязки WPF не работают с внутренними свойствами. О, Microsoft... О чем ты думал?
Обновить:
Вот что я понял до сих пор (Спасибо, @ Grx70):
- WPF не является родной частью.NET Framework, это просто "подключаемый модуль", который также написан Microsoft. Вот почему он не может получить доступ к
internal
члены вашего собрания. - Microsoft могла бы позволить WPF уважать
[assembly: InternalsVisibleTo("XXX")]
атрибута, но на данный момент WPF игнорирует его, что, к сожалению, не оставляет легкого обходного пути. Примечание: я тестировал с помощьюInternalVisibleTo
- как подписанные, так и неподписанные, с PresentationFramework, PresentationCore и целой кучей других библиотек DLL без удачи. - Единственный обходной путь, о котором я могу подумать сейчас, - это создать класс "Прокси", который может предоставлять все необходимые члены как общедоступные. Это довольно PITA (у меня МНОГО классов, и я ненавижу кошмар обслуживания, связанный с созданием равного количества классов "Proxy") - так что я мог бы использовать PostSharp, Fody или какой-то ткач для автоматического -создать эти классы "прокси", если я могу.
Всего доброго всем, кто сталкивается с этой проблемой.