动态设置文本框文本

6

我有多个XAML TextBox,每个TextBox都操作一个数组中对应的值。当TextBox中的值被改变时,会使用一个C#方法来动态检查调用该方法的TextBox

    <TextBox x:Name="_0_0" TextChanged="_x_y_TextChanged"/>
    <TextBox x:Name="_0_1" TextChanged="_x_y_TextChanged"/>
    <TextBox x:Name="_0_2" TextChanged="_x_y_TextChanged"/>
    // And so on.....

每个文本框都对应数组中的一个值,当 TextBox 的值改变时,使用一个 C# 方法动态检查调用该方法的 TextBox

    private void _x_y_TextChanged(object sender, TextChangedEventArgs e)
    {
        TextBox current = (TextBox)sender;
        string currentname = current.Name;
        string rowstring = currentname.Substring(1, 1);

        string columnstring = currentname.Substring(3, 1);

        int row = Convert.ToInt32(rowstring);
        int column = Convert.ToInt32(columnstring);

        // I've then detected the name of the textbox which has called it...

因此,这些信息可用于动态存储来自TextBox的信息在相应的数组索引中,或者您想对其执行的任何操作...

然而,我的问题是:

我如何创建一个方法,使用我的数组中的索引位置,调用相关的TextBox并更新其文本?

4个回答

8
使用FindName(string)按照以下方式查找名称为文本框(其中container是包含所有文本框的控件):
private void UpdateTextBox(int row, int column, string text)
{
    TextBox textBox = container.FindName("_" + row + "_" + column) as TextBox;
    if(textbox != null)
    {
        textbox.Text = text;
    }
}

3

你可能有两种选择:

如果你需要管理大量数据,或者无法预测数组的长度,最好绑定到集合而不是手动操作数据。如果你创建一个从ObservableCollection派生的类而不是使用一个数组,数据与ui之间的关系就非常简单了。

如果你真的需要手动操作,也许把索引放入文本框的“tag”字段中会更好。你可以(a)在xaml中清楚地看到它,(b)轻松解析它,(c)如果你使用本公式的变体:

通过类型查找WPF窗口中的所有控件

你可以在窗口中迭代文本框,通过查看其标签索引找到正确的文本框:

    foreach (TextBox t in FindVisualChildren<TextBox>(this))
    {
        if ((int) t.Tag)  == my_index )
        {
            t.Text = "my_text_goes_here";
         }
    }

1

我会沿着我在这个问题上给出的答案方向前进: 表单锚/停靠 简而言之,我会创建一个保存实际值的类,然后创建一个保存信息类的集合。

然后我不会使用TextBoxes上的事件"TextChanged",而是"嗅探"用于保存文本的依赖属性的更改。这可以很容易地在依赖属性中完成。

最后,我会使用ItemsControl或ItemsPresenter来显示控件。控件数量将遵循集合中的项目数。


0
我建议使用MVVM模式、数据模板和ItemsControl来有效地处理这个问题。

3
或许您可以举一个简短的例子来说明您的意思。目前来看,它缺乏有用的细节帮助解决问题所提出的问题。 - Jeromy Irvine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接