Чтение дочерних тегов в xaml (аналогично ListBox) - PullRequest
0 голосов
/ 07 ноября 2011

в списках Silverlight можно заполнить либо через класс observablecollection, либо через xaml следующим образом:

        <TextBox Name="tb" Text="DroplistBox" Width="140" Height="30"></TextBox>
        <ListBox Name="lb" Width="150" Height="200" SelectionMode="Single">
           <ListBoxItem>
                <TextBox Text="1" Width="140" Height="30"></TextBox>
            </ListBoxItem>
            <ListBoxItem>
                <TextBox Text="2" Width="140" Height="30"></TextBox>
            </ListBoxItem>
            <ListBoxItem>
                <TextBox Text="3" Width="140" Height="30"></TextBox>
            </ListBoxItem>
            <ListBoxItem>
                <TextBox Text="4" Width="140" Height="30"></TextBox>
            </ListBoxItem>
        </ListBox>

Итак, мой вопрос, как я могу продублировать это в своем собственном контроле?Так что, в принципе, я не уверен, как бы я разбирал ListBoxItem, которые существуют внутри ListBox.это своего рода функция типа List FindChildren (имя строки), которую я должен искать?

Я решил это с помощью ответа Фозона , вот суть того, что я сделал, если кто-нибудьбыл заинтересован, так как я не мог четко объяснить себя в своем комментарии к ответу Фозона:

   [ContentProperty( "Items" )]
   public class ControlWithChildReader : Control
   {

      List<object> m_objects = new List<object>( );
      public object Items
      {
         get
         {
            return m_objects[ 0 ]; //probably not needed haha
         }
         set
         {
            m_objects.Add( value );

         }
      }

Ответы [ 3 ]

2 голосов
/ 07 ноября 2011

Это может помочь при работе с шаблонами и элементами управления внутри элементов управления. Рассмотрим этот XAML:

XAML

    <ListBox Name="lb" Width="150" Height="200" SelectionMode="Single">
       <ListBoxItem>
            <TextBox Text="1" Width="140" Height="30"></TextBox>
        </ListBoxItem>
        <ListBoxItem>
            <TextBox Text="2" Width="140" Height="30"></TextBox>
        </ListBoxItem>
        <ListBoxItem>
            <TextBox Text="3" Width="140" Height="30"></TextBox>
        </ListBoxItem>
        <ListBoxItem>
            <TextBox Text="4" Width="140" Height="30"></TextBox>
        </ListBoxItem>
    </ListBox>

Если вы пытаетесь получить текстовые поля внутри списка:

если есть элемент списка со списком и вы хотите получить доступ к TextBox внутри:

ListBoxItem item1 = lb.SelectedItem;
Textbox tb1 = item1.GetVisualDescendants().OfType<TextBox>().FirstOrDefault() as TextBox;

, если вы хотите получить все текстовые поля внутри всего списка:

List<Textbox> tbCollection = lb.GetVisualDescendants().OfType<TextBox>().ToList();

Вы также можете попробовать использовать:

GetVisualAncestors(); - Gets all anscestor controls(parent of parent of the item)
GetVisualChildren(); - Gets all controls inside a controls which are in the control
GetVisualSiblings(); - Gets all controls that share the same parent with the control
2 голосов
/ 07 ноября 2011

Вы можете повторить поведение, которое демонстрирует ItemsControl, поместив следующий атрибут в вашу коллекцию

[ContentProperty("Items", true)]

Это добавит содержимое XAML в свойство коллекции Items.

1 голос
/ 07 ноября 2011

Вы можете получить эту функциональность, унаследовав от ItemsControl и затем получить доступ к дочерним элементам через свойство Items .

...