3

コードビハインドのものにバインドするListBoxがあるとしましょう:

<ListBox x:Name="list">
   <ListBox.ItemTemplate>
      <DataTemplate>
         <ListBoxItem Content="{Binding Name}" />
      </DataTemplate>
   </ListBox.ItemTemplate>
</ListBox>

<TextBox x:Name="name" Text="{Binding ElementName=list, Path=SelectedItem.Name, Mode=TwoWay" />
<TextBox x:Name="contents" Text="{Binding ElementName=list, Path=SelectedItem.Contents, Mode=TwoWay" />

背後にあるコード:

public class Dude
{
   public String Name { get; set; }
   public String Contents { get; set; }
}

さて、上記は私が望んでいることを実行します。リストボックス内の項目が選択されると、テキストボックスが更新され、リストボックス内で選択されたものが表示されます。

しかし、私が今やろうとしているのは、辞書を追加してDudeクラスを拡張することです。

public class Dude
{
   public string Name { get; set; }
   public string Contents { get; set; }
   public Dictionary<String, String> Tasks { get; set; }
}

私ができることを願って:

リストボックスでアイテムをクリックし、対応するアイテムの名前とコンテンツのプロパティをそれぞれのテキストボックスに表示してから、コンテンツのテキストボックスに辞書のコンテンツのキー/値を追加します。

しかし、どうすればそんなに深くなることができるのかわかりません。複数のレベルに進んでいるような気がしますが、多次元バインディングのようなものが必要ですか?

あなたが持っている、または見た(単純な)サンプルはありますか?ドキュメント、記事、チュートリアル?

どんな助けでも大歓迎です。

ありがとうございました

4

1 に答える 1

3

必要なことはWPF(Wp7やWinRTなどの他のXAMLテクノロジでは少し難しい)で実行できますが、それが必要なものかどうかはわかりません...

MultiBindingを使用して、Contents文字列とTasksディクショナリの両方を2番目のテキストボックスにバインドしてから、独自のIMultiValueConverterを記述して、表示する文字列を作成します。

ここでマルチバインディングに関するチュートリアルを読んでください。大まかなコードは次のようになります。

<TextBox>
   <TextBox.Text>
      <MultiBinding Converter="{StaticResource YourAppendingConverter}">
         <Binding ElementName="list" Path="SelectedItem.Contents" />
         <Binding ElementName="list" Path="SelectedItem.Tasks" />
      </MultiBinding>
   </TextBox.Text>
</TextBox>

コンバーターは次のようになります。

public class YourAppendingConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, 
      System.Globalization.CultureInfo culture){
       StringBuilder sb = new StringBuilder(values[0].ToString());
       sb.AppendLine("Tasks:");
       foreach (var task in (Dictionary<string,string>)values[1]){
         sb.AppendLine(string.Format("{0}: {1}", task.Key, task.Value));
       }
       return sb.ToString();
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, 
      System.Globalization.CultureInfo culture){
        throw new NotSupportedException();
    }

なぜこれがあなたに必要なものだと思いますか?

  1. 必要に応じてConvertBackを作成するのは大変なので、このTextBoxは読み取り専用にする必要があります
  2. 辞書は通知していません。表示中に基になる辞書が変更されても、何も変更されません

これらをよく考えれば、MultiBindingが必要なツールかもしれません。

于 2012-10-01T08:28:44.093 に答える