2016-07-17 4 views
0

Я создаю приложение, в котором есть элемент TextBox внутри DataTemplate, в ListBox в WPF. Я хочу получить доступ к элементу TextBox по имени, чтобы отредактировать или прочитать значение непосредственно из кода C#, пожалуйста, помогите. В приложении WPF добавлено несколько текстовых полей, поэтому как я могу их отсортировать по индексу?Доступ к вложенному элементу управления XAML в C#

<ListBox x:Name="listBox" HorizontalAlignment="Left" Height="336" Margin="276,69,0,0" VerticalAlignment="Top" Width="242" SelectionChanged="listBox_SelectionChanged"> 
     Grid.IsSharedSizeScope="True" 
     HorizontalContentAlignment="Stretch"> 
     <ListBox.ItemTemplate> 
      <DataTemplate x:Name="D_Template"> 
       <Grid Margin="4" Width="222"> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="Auto" SharedSizeGroup="Key" /> 
         <ColumnDefinition Width="*" /> 
        </Grid.ColumnDefinitions> 
        <TextBox x:Name ="TextValue" Grid.Column="1" Text="{Binding Value}" /> 
       </Grid> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

Как вы можете видеть, ListBox имеет имя переменной «ListBox», то DataTemplate был назначен на «D_Template» и TextBox присваивается имя «TextValue». Любая помощь приветствуется, спасибо за ваше время. :)

+0

Если вы хотите получить к нему доступ из Code Behind, атрибут x: Name должен работать нормально. – Fang

+0

Спасибо за ваш ответ! <3 Я пробовал это, но безрезультатно. Попытка ссылаться на атрибут x: Name непосредственно на C# не показывает результатов в Visual Studio. Добавьте небольшой фрагмент кода, который вы хотите использовать для доступа к нему. – Connor

+2

Нет, вам нужно предоставить хороший [mcve], показывающий, что именно вы пытаетесь сделать. Практически в каждом случае доступ к элементам пользовательского интерфейса напрямую - неправильная работа. Значение, к которому вам нужно получить доступ, должно быть привязано к некоторому объекту модели представления, который вы можете использовать для извлечения значения. В вашем примере это означает, что ваш «ListBox» отображает коллекцию объектов модели просмотра, привязанную к шаблону, где свойство (или свойства) модели представления привязано к свойству (свойствам) «TextBox», к которому вы хотите получить доступ , Просьба представить более четкий пример кода и точное описание того, что вы пытаетесь сделать. –

ответ

0

Вы должны действительно привязать элементы listbox itemssource к коллекции объектов и прочитать/изменить его вместо прямого доступа к текстовому полю. Но если по какой-то причине вы не можете или не хотите этого делать, это код может помочь вам. (Обратите внимание, что я действительно отговариваю это решение)

private void Button_Click(object sender, RoutedEventArgs e) 
    { //pretend you want to access the second item 
     object myItem = myListbox.Items[1]; 
     ListBoxItem container = myListbox.ItemContainerGenerator.ContainerFromItem(myItem) as ListBoxItem; 
     ContentPresenter contentPresenter = FindVisualChild<ContentPresenter>(container); 
     DataTemplate myDataTemplate = contentPresenter.ContentTemplate; 
     TextBox myTextbox = myDataTemplate.FindName("myTextbox", contentPresenter)as TextBox; 
     if (myTextbox != null) 
     { 
      myTextbox.Text = "text changed!"; 
     } 
    } 

    public static IEnumerable<T> FindVisualChildren<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) 
       { 
        yield return (T)child; 
       } 

       foreach (T childOfChild in FindVisualChildren<T>(child)) 
       { 
        yield return childOfChild; 
       } 
      } 
     } 
    } 

    public static childItem FindVisualChild<childItem>(DependencyObject obj) 
     where childItem : DependencyObject 
    { 
     foreach (childItem child in FindVisualChildren<childItem>(obj)) 
     { 
      return child; 
     } 

     return null; 
    } 
+0

Спасибо! Я возьму то, что ты сказал мне, в большой степени. - CR – Connor

Смежные вопросы