如何从Windows Phone运行时中的所有文本框(动态创建文本框)访问文本

时间:2015-04-13 10:00:17

标签: windows-phone windows-phone-8.1 winrt-xaml

我一直在尝试从文本框集合中获取文本,这些文本框是通过使用项目控件将集合绑定到堆栈面板动态创建的,该控件是我在Windows Phone运行时中的页面上加载的单独用户控件。

以下是我的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。

正如您所看到的,我使用ItemsScroll将“SelectedCategorySettings”集合绑定到StackPanel,后者显示基于集合的文本框数量。在这里我无法弄清楚是否要将页面上显示的所有文本框中的文本保存为json文件,如何访问上述场景中动态显示的所有文本框的文本?

PS:请注意,控件是在一个单独的用户控件中。

先谢谢

2 个答案:

答案 0 :(得分:0)

您应该对SelectedCategorySettings使用ObservableCollection,并且包含SettingKey和SettingValue的模型类应该实现INotifyPropertyChanged接口,如下面的示例代码所示。如果你正确地执行它,那么UI中发生的任何更改(在您的情况下,文本框的文本更改)将自动反映在ObservableCollection中的模型对象中。如果您有兴趣了解有关其工作原理的更多信息,我建议您在Windows Phone开发中搜索mvvm设计模式。

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));
        }
    }
}

答案 1 :(得分: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;
}