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 или какой-то ткач для автоматического -создать эти классы "прокси", если я могу.

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

Другие вопросы по тегам