0

ItemsControlテンプレートを使用してデータをバインドするもの があります。

<ItemsControl ItemsSource="{Binding MyCollection}"  x:Name="MyCollectionControl" ItemTemplate="{DynamicResource MyCollectionTemplate}" />  

MyCollectionはのタイプでNameValueCollectionあり、次のバインディングは機能しません。正しい数のペアを入力TextBlockしていますが、制限された値を取得していません。

レンプレート

 <DataTemplate x:Key="MyCollectionTemplate">
        <Grid>
            <TextBlock Text="{Binding Path=Value, Mode=OneWay}"/>
            <TextBox Name="CValue"/>
        </Grid>
 </DataTemplate>    

mainWindow

string[] dataCollection=new string[5];
....
....
Student studentObject=new Student("1",dataCollection);

this.dataContext = studentObject;  

学生クラス

public class Student
{
    public string Id;
    public NameValueCollection MyCollection {get; set;}    

    public Student(string id, params string[] additionalInfo)
    {
        Id =  id;       

        if (additionalInfo != null)
        {
            MyCollection=new NameValueCollection();

            foreach (string s in MyCollection)
            {
                string[] tokens = s.Split('|');
                if (tokens.Length == 2)
                    MyCollection.Add(tokens[0], tokens[1]);
            }
        }
     }
}

バインドするときに私がしている間違っていることは何ですかNameValueCollection

アドバイスしてください。

4

1 に答える 1

1

OK、いくつかのことです。テキストボックスをテキストブロックの真上にオーバーレイしているので、DataTemplateを少し変更したいと思うかもしれません。私のテストでは、スタックパネルに変更しました。

<StackPanel>
    <TextBlock Text="{Binding}"/>
    <TextBox Name="CValue"/>
</StackPanel>

Text="{Binding}"また、NameValueCollection内のアイテムは単なる文字列であり、value属性を持たないため、単純に変更したことに注意してください。

また、これが単なる別のタイプミスであったかどうかはわかりませんが、これは次のとおりです。

foreach (string s in MyCollection)
{
    string[] tokens = s.Split('|');
    if (tokens.Length == 2)
        MyCollection.Add(tokens[0], tokens[1]);
}

おそらく言うべきです:

foreach (string s in additionalInfo)
{
    string[] tokens = s.Split('|');
    if (tokens.Length == 2)
        MyCollection.Add(tokens[0], tokens[1]);
}

それ以外の場合は、空のコレクションを繰り返し処理しているだけです。

于 2013-02-26T04:14:35.503 に答える