zoukankan      html  css  js  c++  java
  • How to get the control inside the ControlTemplate/DataTemplate on run time.

    Here is a similar example to get control inside DataTemplate at runtime.

     XAML code:

       <StackPanel>

            <StackPanel.Resources >

                <local:People  x:Key="mydata"/>

            </StackPanel.Resources>

            <ComboBox ItemsSource="{StaticResource mydata}" Name="myComboBox">

                <ComboBox.ItemTemplate>

                    <DataTemplate>

                        <StackPanel Orientation="Horizontal">

                            <TextBox Name="txtName" Text="{Binding  Path=Name}" GotFocus="textBoxGetFocus"/>

                            <TextBox Name="txtID" Text="{Binding Path=ID}" GotFocus="textBoxGetFocus"/>

                        </StackPanel>

                    </DataTemplate>

                </ComboBox.ItemTemplate>

            </ComboBox>

            <Button  Width="250" Margin="20,100,20,20"  Content="Get name from DataTemplate and change it" Click="btnChangeIt" ></Button>

    </StackPanel> 

     

    In the code behind:

       public partial class Window1 : Window

        {

            public Window1()

            {

                InitializeComponent();

            }

            ComboBoxItem item;

            // the index is the first item by default

            int index=0;

            void textBoxGetFocus(object sender, RoutedEventArgs e)

            {

                TextBox text = e.Source as TextBox;

                myComboBox.SelectedItem = text.DataContext;

                // get the selected item's index

                index = myComboBox.Items.IndexOf(myComboBox.SelectedItem);

            }

            void btnChangeIt(object sender, RoutedEventArgs e)

            {

                item = myComboBox.ItemContainerGenerator.ContainerFromIndex(index) as ComboBoxItem;

                if (item != null)

                {

                    // get the selected combobox item's Parenttemplate

                    ContentPresenter templateParent = GetFrameworkElementByName<ContentPresenter>(item);

                    //get teh datatemplate

                    DataTemplate dataTemplate = myComboBox.ItemTemplate;

                    if (dataTemplate != null && templateParent != null)

                    {

                        TextBox textbox = dataTemplate.FindName("txtName", templateParent) as TextBox;

                        MessageBox.Show("Get the name value: "+textbox.Text);

                    }

                }

            }

            private static T GetFrameworkElementByName<T>(FrameworkElement referenceElement) where T : FrameworkElement

            {

                FrameworkElement child = null;

                //travel the visualtree by VisualTreeHelper to get the template

                for (Int32 i = 0; i < VisualTreeHelper.GetChildrenCount(referenceElement); i++)

                {

                    child = VisualTreeHelper.GetChild(referenceElement, i) as FrameworkElement;

                    System.Diagnostics.Debug.WriteLine(child);

                    if (child != null && child.GetType() == typeof(T))

                    { break; }

                    else if (child != null)

                    {

                        child = GetFrameworkElementByName<T>(child);

                        if (child != null && child.GetType() == typeof(T))

                        {

                            break;

                        }

                    }

                }

                return child as T;

            }

     

        }

        public class People : System.Collections.ObjectModel.ObservableCollection<person>

        {

            public People()

            {

                this.Add(new person() { Name="name1",ID="ID1"});

                this.Add(new person() { Name = "name2", ID = "ID2" });

                this.Add(new person() { Name = "name3", ID = "ID3" });

     

            }

           

        }

        public class person

        {

            public string Name { get; set; }

            public string ID { get; set; }

        }

    还有用:

    [TemplatePart(Name = "PART_DropDown", Type = typeof(Button))]
        [ContentProperty("Items")]
        [DefaultProperty("Items")]
        public class SplitButton : Button

    {

     

     public override void OnApplyTemplate()
            {
                base.OnApplyTemplate();

                // set up the event handlers
                ButtonBase dropDown = this.Template.FindName("PART_DropDown", this) as ButtonBase;
                ContentPresenter contentpresenter = this.Template.FindName("contenPesenter", this) as ContentPresenter;
               
                if (dropDown != null)
                    dropDown.Click += DoDropdownClick;

                dropDown.IsEnabled = false;
              

            }

    }


        {

  • 相关阅读:
    CenOS下搭建PPTP服务
    Nginx做反向代理总是被系统kill
    python排序算法
    linux系统中rsync+inotify实现服务器之间文件实时同步
    HDU
    BZOJ1237: [SCOI2008]配对
    BZOJ2243: [SDOI2011]染色
    BZOJ3192: [JLOI2013]删除物品
    点分治小结
    AtCoder Beginner Contest 124 解题报告
  • 原文地址:https://www.cnblogs.com/liangouyang/p/1310362.html
Copyright © 2011-2022 走看看