我为 50 个文本块分配了名称_1, _2,_3,....,_50
,并设法使用 for 循环将名称存储在一个数组中。像这样:
string[] textname = new string[51];
for(int i = 1; i <= 50; i++)
{
textname[i] = "_" + i.ToString();
}
但我想将文本属性分配给字符串数组中名称为文本块的文本块。如何做到这一点?
我为 50 个文本块分配了名称_1, _2,_3,....,_50
,并设法使用 for 循环将名称存储在一个数组中。像这样:
string[] textname = new string[51];
for(int i = 1; i <= 50; i++)
{
textname[i] = "_" + i.ToString();
}
但我想将文本属性分配给字符串数组中名称为文本块的文本块。如何做到这一点?
我认为从代码中引用控件不是一个好主意。我建议另一种(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; }
}
在页面内您需要设置ViewModel
为DataContext
:
DataContext = new ViewModel();
您可以直接在Strings
集合中修改值:
viewModel.Strings[12] = "NewValue";
如果由于某种原因您需要在页面上单独排列文本块,您也可以这样做并绑定到集合中的正确索引:
<TextBlock Text="{Binding Strings[12]}" />
但是在这种情况下,拥有单独的命名属性而不是在集合中索引它们会更有意义。
虽然其他答案指出您的方法可能不合适,但我发现仍然有必要向您解释如何实际做您想要完成的事情。您需要使用反射按名称访问属性。请注意,我给您的示例特定于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 方法,您的要求可能会有所不同。我还应该指出,虽然这是一个解决方案,但最好重新考虑您的设计,这样您就不必使用反射来访问属性。
现在你只有一个字符串数组,你需要的是一个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});
}