首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ContentPresenter找不到控制

ContentPresenter找不到控制
EN

Stack Overflow用户
提问于 2015-04-16 10:28:10
回答 1查看 881关注 0票数 1

我有一个ItemsControl定义如下

代码语言:javascript
复制
<ItemsControl Name="PlannerItemControl">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid Name="MainGrid">
             <Grid.ColumnDefinitions>
               <ColumnDefinition Width="200"/>
               <ColumnDefinition Width="Auto" />
               <ColumnDefinition />
             </Grid.ColumnDefinitions>
             <Grid.RowDefinitions>
               <RowDefinition Height="*" />
               <RowDefinition Height="auto" />
             </Grid.RowDefinitions>
             <TextBox Name="test" ></TextBox>
...
...
...
          </Grid>
      </DataTemplate>
  </ItemsControl.ItemTemplate>
</ItemsControl>

在后面的代码中,我想循环遍历项目中的所有控件。

代码语言:javascript
复制
PlannerItemControl.ItemsSource = Plannermod.TimetableModelList;

foreach (var item in PlannerItemControl.Items)
{
  ContentPresenter cp = PlannerItemControl.ItemContainerGenerator.ContainerFromItem(item) as ContentPresenter;
  TextBox tb = FindVisualChild<TextBox>(cp);
  if (tb != null)
  {
                // do something with the textbox
  }
}

public static T FindVisualChild<T>(DependencyObject depObj) where T : DependencyObject
{
   if (depObj != null)
   {
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
     {
       DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
       if (child != null && child is T)
       {
         return (T)child;
       }

       T childItem = FindVisualChild<T>(child);
       if (childItem != null) return childItem;
     }
   }
   return null;
 }      

问题是cp的值始终是空的,尽管在itemscontrol中有项,因为我进入了foreach循环。请帮帮忙

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-16 11:36:24

我认为问题是在Xaml,但我不知道什么是确定的。也许还有其他的风格?下面的代码经过测试并运行良好

MainWindow XAML:

代码语言:javascript
复制
<ItemsControl x:Name="PlannerItemControl"  Width="100" Height="100">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Grid x:Name="MainGrid">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="200"/>
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*" />
                        <RowDefinition Height="auto" />
                    </Grid.RowDefinitions>
                    <TextBox x:Name="test" ></TextBox>

                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
    <Button Height="20" Width="100" Click="ButtonBase_OnClick"> Click me!</Button>
            </StackPanel>

MainWindow.cs:

代码语言:javascript
复制
   public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = new MainViewModel();
            PlannerItemControl.ItemsSource = new List<string>() {"a", "b", "c"};

        }



        public static T FindVisualChild<T>(DependencyObject depObj) where T : DependencyObject
        {
            if (depObj != null)
            {
                for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
                {
                    DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
                    if (child != null && child is T)
                    {
                        return (T)child;
                    }

                    T childItem = FindVisualChild<T>(child);
                    if (childItem != null) return childItem;
                }
            }
            return null;
        }    

        private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
        {
            foreach (var item in PlannerItemControl.Items)
            {
                ContentPresenter cp = PlannerItemControl.ItemContainerGenerator.ContainerFromItem(item) as ContentPresenter;
                TextBox tb = FindVisualChild<TextBox>(cp);
                if (tb != null)
                {
                    tb.Text = item.ToString();
                    // do something with the textbox
                }
            }
        }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29671993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档