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バインドするプロパティは、UIに変更が通知されるようにする必要がありますObservableCollection

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]}" />

この場合、コレクション内でインデックスを作成するのではなく、個別の名前付きプロパティを使用する方が理にかなっています。

于 2012-12-25T06:02:37.403 に答える
0

他の回答はおそらくあなたのアプローチは適切ではないと指摘していますが、私はあなたが達成したいことを実際に行う方法をあなたに説明する必要があると思います。名前でプロパティにアクセスするには、 Reflectionを使用する必要があります。私が提供する例は、他のプロジェクトタイプとは少し異なるため、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メソッドを使用しました。これは解決策ですが、プロパティにアクセスするためにReflectionを使用する必要がないように、デザインを再考する方がおそらく良いことも指摘しておく必要があります。

于 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 に答える