2014-02-07 3 views
2

I know this question has been asked before. Я не удовлетворен ответом, который был дан. Я ищу решение для компиляции. Есть ли способ сказать скрыть членов Items и ItemSource, не нарушая функциональность класса, или это не ожидаемая функциональность? Например, могу ли я создать ItemsControl<T> посредством отражения ItemsControl и смены кода или как я могу это сделать?Ограничить время компиляции данных ItemsControl

Чтобы разработать, я создаю элемент управления SlideShow для отображения изображений в слайд-шоу. Он наследует элемент ItemsControl, поскольку он имеет несколько дочерних элементов, но я хотел бы ограничить его доступ к объектам изображения только потому, что мне нужен доступ к этим объектам. Я хотел бы использовать это ограничение во время компиляции, чтобы я мог безопасно получать доступ к определенным членам изображения, не беспокоясь о том, какие у них типы.

+0

Ну, вы можете наследовать элемент ItemsControl и создать класс с этим. Это может быть жизнеспособным решением для времени компиляции. Помимо этого вы можете добиться этого только с помощью Runtime. – Thanigainathan

+0

Да, вы можете наследовать и создать класс, как я упоминал в вопросе ... Вы также можете скрыть элементы Items и ItemSource, однако остальная часть функциональности класса будет нарушена, так как она использует внутреннюю структуру для хранения пункты и т. д. –

+0

Вы не хотите хранить свои изображения в ObservableCollection?Он может быть привязан к ItemsControl для отображения содержащихся изображений любым способом, который вы хотите, и является типичным, чтобы вы могли манипулировать элементами. – Benjamin

ответ

0

Я понял. В Windows Phone Toolkit есть элемент управления, который имеет то же самое поведение, которое я ищу. Объект зависимостей TiltEffect обеспечивает его родительский тип во время компиляции. «Свойство IsTiltEnabled не поддерживает значения типа ...» Я просто должен сделать то же самое, но для детей моего контроля.

Что вам нужно сделать, точнее, изменить элементы (через ItemsSource ...) элемента ItemsContorl на строго типизированную коллекцию, например. a ObservableCollection

0

Я не очень опытен в WPF, но на простом C# я просто делегировал управление.

Например, если я пытался ограничить объекты, я мог бы добавить к ArrayList, я бы что-то вроде:

public class ArrayListDemo 
{ 
    private ArrayList innerList; 

    public ArrayListDemo() 
    { 
     innerList = new ArrayList(); 
    } 

    public int Add(string str) 
    { 
     return innerList.Add(str); 
    } 

    public void Remove(string str) 
    { 
     innerList.Remove(str); 
    } 

    public string this[int index] 
    { 
     get 
     { 
      return innerList[index] as string; 
     } 
     set 
     { 
      innerList[index] = value; 
     } 
    } 

    public static implicit operator ArrayList(ArrayListDemo stringArrayList) 
    { 
     return stringArrayList.innerList; 
    } 
} 

Это позволяет мне написать свою собственную реализацию методов, не требуя, чтобы я перегрузить ВСЕ методы. Наличие неявного приведения в действие означает, что компилятор будет знать, что наш объект можно использовать вместо объекта, который мы переопределяем. Опять же, я не знаю, можно ли это сделать с WPF, или если работа, связанная с переопределением и делегированием ваших вызовов, просто слишком сложна, но я подумал, что я бы указал на этот подход, если он будет полезен.

+0

Это отличное предложение и единственное, что я мог видеть. При этом в классе ItemsControl имеется несколько свойств и методов, которые управляют внутренней коллекцией элементов класса. Как я могу скрыть их, не нарушая все функциональные возможности этого класса (например, добавив дочерние элементы в XAML, убедитесь, что используется сильно типизированная коллекция, которую я использую для скрытия других свойств, вместо какого-либо другого внутреннего аспекта класс). Я знаю Элементы и ItemSource, но что другие, и будет ли класс по-прежнему функционировать, просто скрывая их? –

+0

Вот почему я замучил свой ответ с отказами! Я не знаю WPF почти достаточно, но, возможно, кто-то еще может прослушивать. Единственное, что я могу придумать, это, может быть, фреймворк, поскольку он ищет определенный тип объекта, из которого ваш класс не наследует, он будет быть неявным броском, который передал бы вам ваш завернутый объект соответствующего типа. Магия? По крайней мере, это то, на что я надеялся. –

+0

Свойство Items имеет тип ItemCollection. В замечаниях для такого класса я думаю, что это может дать нам ключ. Я просто не совсем понимаю, что они говорят, может быть, вы бы это сделали? http://msdn.microsoft.com/en-us/library/windowsphone/develop/system.windows.controls.itemcollection(v=vs.105).aspx Спасибо за помощь. Если мы не сможем понять это, мы надеемся, что кто-то еще перезвонит. –

0

Какое «специальное поведение» вам нужно обрабатывать, чтобы итерации через элементы нужно было выполнять внутри элемента управления?

Вы не можете использовать дженерики в XAML (хотя вы можете СДЕЛАТЬ его работу ограниченным образом), поэтому все, что вы делаете, будет ТОЛЬКО когда-либо иметь возможность обрабатывать один тип объекта, в вашем случае Image. Как это более многоразовое, что привязывает любой тип, который вы хотите во время выполнения?

Что не так с созданием UserControl для обработки ваших функций слайд-шоу, а не для того, чтобы заставить тип управления не предназначаться для того, что вы делаете в нем?

Почему вы выполняете итерацию через свойство Items? Кажется, что он действительно предназначен для использования в основном базовой системой WPF, а не клиентом. Какую функциональность вы получаете от выполнения этого, чего не может быть достигнуто посредством простой привязки?

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