Возможно ли «DataBind» отдельное свойство пользовательского элемента управления? - PullRequest
1 голос
/ 03 декабря 2010

Прежде чем я вернусь к вопросу, позвольте мне немного рассказать об этом. Я пытаюсь разработать собственный механизм кэширования, который можно применять к пользовательским элементам управления. (Имейте в виду, что я знаю, что в .NET есть какой-то встроенный механизм кэширования). В зависимости от определенных флагов, установленных декларативно в разметке, элемент управления должен загрузить кэшированную версию своего ранее визуализированного содержимого или выполнить нормально (и если определенные флаги установлены, он должен генерировать кэш своего содержимого для следующей загрузки). Я хотел бы иметь возможность декларативно передавать некоторые флаги в разметке и иметь возможность проверить их значение в Page Init и, в зависимости от значения флага, определить, должен ли элемент управления загружать кэшированную версию или нет.

<uc:MyUC ID="N1" runat="server"
   CacheProp='<%# SomeEnum.A | SomeEnum.B |SomeEnum.C %>'
   PropA='<%# this.SomePropA %>' 
   PropB='<%# (this.SomePropB %>'
   PropC='<%# this.SomePropC %>'
/>

Проблема, с которой я сталкиваюсь, заключается в том, что, насколько мне известно, я могу получить значение свойств, декларативно назначенных в разметке, только если я вызвал DataBind (). Однако я столкнулся с двумя проблемами: Во-первых, вызов this.DataBind() изнутри MyUC вызовет привязку всех его дочерних элементов управления, что нарушит назначение кэша; также все пользовательские элементы управления были созданы таким образом, чтобы они не вызывали DataBind() до того, как произошло событие LoadComplete, чтобы убедиться, что родительские элементы управления, в которых они живут, выполнили свою инициализацию и вычислили свойства, которые декларативно передаются в дочерний пользовательский элемент управления (т. е. PropA, PropB, PropC).

А теперь вопрос: есть ли способ связать свойство CacheProp, чтобы получить его значение без привязки данных ко всем другим свойствам и без запуска привязки данных всех его дочерних элементов управления?

Спасибо за помощь!

Giuseppe

1 Ответ

0 голосов
/ 09 декабря 2010

Это должно работать:

<uc:MyUC ID="N1" runat="server" CacheProp="A|B|C"... >

Код:

strRawValue = N1.Attributes["CacheProp"];
string[] arrValues = strRawValue.Split('|');
SomeEnum value = (SomeEnum)Enum.Parse(typeof(SomeEnum), arrValues[0]);
for (int i = 1; i < arrValues.Length; i++)
    value |= (SomeEnum)Enum.Parse(typeof(SomeEnum), arrValues[i]);
...