2015-04-13 1 views
0

Я пытаюсь получить тексты из коллекции текстовых полей, которые создаются динамически, связывая коллекцию с панелью с помощью элементов управления который находится в отдельном пользовательском элементе управления, который я загружаю на странице во время работы Windows-телефона.Как получить доступ к тексту из всех текстовых полей (где текстовые файлы создаются динамически) в Windows Windows runtime

Ниже приведен код моего UserControl:

<UserControl 
    x:Class="CfMobility.UserControls.CredentialsUserControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="using:CfMobility.UserControls" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    d:DesignHeight="300" 
    d:DesignWidth="400"> 

    <ScrollViewer> 
    <ItemsControl ItemsSource="{Binding SelectedCategorySettings}"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <StackPanel IsTapEnabled="False"> 
        <TextBlock Text="{Binding SettingKey}" Style="{ThemeResource BaseTextBlockStyle}"></TextBlock> 
        <TextBox Text="{Binding SettingValue}" Width="300px"/> 
       </StackPanel> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
    </ScrollViewer> 
</UserControl> 

У меня есть контроль содержания в другой странице, как показано ниже:

<ContentControl x:Name="Container" Grid.Row="1" Margin="19,10,19,0"> 
     </ContentControl> 

Где я связывание этого контроля контента в выше StackPanel, когда я нахожусь переход на страницу.

Как вы можете видеть, у меня была привязанная коллекция «SelectedCategorySettings» к StackPanel с помощью ItemsScroll, которая отображает количество текстовых полей на основе коллектора. Здесь я не могу понять, хочу ли я сохранить текст из всех текстовых полей, отображаемых на странице, в json-файл, как получить доступ к тексту всех текстовых полей, которые динамически отображаются в приведенном выше сценарии?

PS: обратите внимание, что элементы управления находятся в отдельном пользовательском элементе управления.

Заранее спасибо

ответ

0

Вы должны использовать ObservableCollection для SelectedCategorySettings и ваш класс модели, которая содержит SettingKey и SettingValue должны осуществлять INotifyPropertyChanged интерфейс, как в следующем примере кода. Если вы сделаете это правильно, то какие бы изменения не произошли в пользовательском интерфейсе (в вашем случае текстовые изменения текстового поля) будут автоматически отражаться в ваших объектах модели в ObservableCollection. Если вам интересно узнать больше о том, как это работает, я рекомендую вам найти шаблон дизайна mvvm в Windows Phone development.

public class Setting : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private string _settingKey; 

    public string SettingKey 
    { 
     get { return _settingKey; } 
     set { 
      _settingKey = value; 
      OnPropertyChanged("SettingKey"); 
     } 
    } 

    private string _settingValue; 

    public string SettingValue 
    { 
     get { return _settingValue; } 
     set { 
      _settingValue = value; 
      OnPropertyChanged("SettingValue"); 
     } 
    } 


    public virtual void OnPropertyChanged(string propertyName) 
    { 
     var propertyChanged = PropertyChanged; 
     if (propertyChanged != null) 
     { 
      propertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
+0

Спасибо за это !! Но моя проблема заключается в одновременном доступе ко всем текстовым полям для сохранения в каком-то файле в локальном хранилище. Как вы можете видеть выше «SettingValue» TextBox. Предположим, что у меня уже есть некоторые значения в «SelectedCategorySettings», что означает, что на этой странице будет много текстовых полей. Теперь предположим, что я редактировал некоторые из этих текстовых полей и хочу сохранить их обратно в некоторый файл, скажем, JSON в локальном хранилище. Поскольку эти текстовые поля создаются динамически, я хочу получить доступ к содержимому для сохранения в файл. Как мне это сделать? –

+0

Да, я понял вашу проблему. Но проблема в том, что вы пытаетесь получить доступ к текстовым полям, созданным ItemsControl, точно так же, как текстовое поле, созданное с помощью xaml по имени или что-то в этом роде. Но это не так, как вы делаете это в телефоне Windows. Вам нужно использовать шаблон mvvm, как я объяснил выше. Если вы правильно это сделаете, значения в «SelectedCategorySettings» будут автоматически обновляться с помощью ui, когда пользователь вводит и изменяет значения в текстовых окнах. Затем вы можете получать новые значения из самой «SelectedCategorySettings». Таким образом, вам не нужны явно текстовые поля для получения новых значений. –

0

Что вам нужно, это метод, как это:

var textBoxes = AllTextBoxes(this); 

public List<TextBox> AllTextBoxes(DependencyObject parent) 
{ 
    var list = new List<TextBox>(); 
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++) 
    { 
     var child = VisualTreeHelper.GetChild(parent, i); 
     if (child is TextBox) 
     { 
      list.Add(child as Control); 
      continue; 
     } 
     list.AddRange(AllChildren(child)); 
    } 
    return list; 
} 
Смежные вопросы