0

我为 50 个文本块分配了名称_1, _2,_3,....,_50,并设法使用 for 循环将名称存储在一个数组中。像这样:

string[] textname = new string[51];
for(int i = 1; i <= 50; i++)
{
     textname[i] = "_" + i.ToString();
}

但我想将文本属性分配给字符串数组中名称为文本块的文本块。如何做到这一点?

4

3 回答 3

1

我认为从代码中引用控件不是一个好主意。我建议另一种(MVVM)方法。

由于您通过索引访问文本块,我想它们显示在列表中。这意味着您可以在 XAML 中将它们创建为ItemsControl

<ItemsControl ItemsSource="{Binding Strings}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Strings您绑定的属性应该是一个ObservableCollection,以便 UI 将收到任何更改的通知:

public class ViewModel
{
    private string _path;

    public ViewModel()
    {
        Strings = new ObservableCollection<string>();

        for (int i = 0; i < 50; i++)
        {
            Strings.Add("Value " + i);
        }
    }

    public ObservableCollection<string> Strings { get; set; }
}

在页面内您需要设置ViewModelDataContext

DataContext = new ViewModel();

您可以直接在Strings集合中修改值:

viewModel.Strings[12] = "NewValue";

如果由于某种原因您需要在页面上单独排列文本块,您也可以这样做并绑定到集合中的正确索引:

<TextBlock Text="{Binding Strings[12]}" />

但是在这种情况下,拥有单独的命名属性而不是在集合中索引它们会更有意义。

于 2012-12-25T06:02:37.403 回答
0

虽然其他答案指出您的方法可能不合适,但我发现仍然有必要向您解释如何实际做您想要完成的事情。您需要使用反射按名称访问属性。请注意,我给您的示例特定于Windows 应用商店应用程序,因为它与其他项目类型略有不同。

IEnumerable<PropertyInfo> properties = this.GetType().GetRuntimeProperties();
var textbox = properties.Single(prop =>
    String.Equals(prop.Name, "_1", StringComparison.OrdinalIgnoreCase))
    .GetValue() as TextBox;

if (textbox != null)
{
    var originalValue = textbox.Text;

    textbox.Text = "new value";
}

请注意,您可以将“_1”替换为属性名称的任何字符串值以获得适当的值。我还Single(...)通过假设您将始终具有匹配的属性名称来使用 LINQ 方法,您的要求可能会有所不同。我还应该指出,虽然这是一个解决方案,但最好重新考虑您的设计,这样您就不必使用反射来访问属性。

于 2012-12-26T14:57:29.350 回答
0

现在你只有一个字符串数组,你需要的是一个TextBlocks.

List<TextBlock> list = new List<TextBlock>();
for (int i = 0; i < 50; i ++)
{
list.Add(new TextBlock() {Text = "something you want to put here", Tag = "_" + i});
}

或者如果你真的想使用一个数组:

TextBlock[] arr= new TextBlock[51];
for (int i = 0; i <= 50; i ++)
{
arr[i] = new TextBlock() {Text = "something you want to put here", Tag = "_" + i});
}
于 2012-12-24T19:14:41.270 回答