#c# #silverlight #xaml #listbox #controls
#c# #silverlight #xaml #listbox #элементы управления
Вопрос:
в Silverlight listbox могут быть заполнены либо с помощью observablecollection class, либо 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 );
}
}
Ответ №1:
Вы можете повторить поведение, которое демонстрирует ItemsControl, поместив следующий атрибут в свою коллекцию
[ContentProperty("Items", true)]
Это добавит содержимое XAML в свойство коллекции элементов.
Комментарии:
1. Ах, это немного помогло, я добавил ContentProperty ( «Элементы» ) и свойство в свой класс под названием TextBox Items, но таким образом я могу прочитать только одно текстовое поле из xaml. Есть ли способ чтения во всех дочерних текстовых полях или нет?
2. Nevermind решил это, создав свойство, добавляющее все, что для него установлено, в список: D
Ответ №2:
Это может помочь при работе с шаблонами и элементами управления внутри элементов управления Рассмотрите этот 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>
Если вы пытаетесь получить текстовые поля внутри элементов listboxitems:
если есть выбранный элемент listbox, и вы хотите получить доступ к текстовому полю внутри :
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
Ответ №3:
Вы можете получить эту функциональность, унаследовав от ItemsControl, а затем получить доступ к дочерним тегам через свойство Items.