在xaml中读取子标签(类似于ListBox的)

时间:2011-11-07 00:13:09

标签: c# silverlight xaml listbox controls

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>

所以我的问题是,如何在我自己的控件中复制它?所以基本上我不确定如何解析ListBox中存在的ListBoxItem。是一种我应该寻找的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 个答案:

答案 0 :(得分: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中获取文本框:

如果有一个已取消的列表框项,并且您想要访问其中的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

答案 1 :(得分:2)

您可以通过在集合中放置以下属性来复制ItemsControl exibits的行为

[ContentProperty("Items", true)]

这会将XAML内容添加到Items集合属性。

答案 2 :(得分:1)

您可以通过继承ItemsControl获取此功能,然后通过Items属性访问子项。