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; }
}

现在上面的内容正是我想要的。当列表框中的项目被选中时,文本框会更新以显示在列表框中选择的内容。

但是我现在要做的是通过向其添加 Dictionary 来扩展我的 Dude 类:

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

希望我能:

单击 ListBox 中的一个项目,使相应项目的名称和内容属性显示在它们各自的文本框中,然后将字典内容的键/值附加到内容文本框。

但我不知道我怎么能走得那么深。感觉就像我要去多个层次一样,像多维绑定这样的东西是我需要的吗?

您有或看过任何(简单的)样本吗?文档、文章、教程?

任何帮助深表感谢。

谢谢

4

1 回答 1

3

你想要的可以在 WPF 中完成(在 Wp7 或 WinRT 等其他 XAML 技术中更难),但我不确定它是否是你需要的......

使用 MultiBinding将 Contents 字符串和 Tasks 字典绑定到第二个文本框,然后编写自己的 IMultiValueConverter 来构建要显示的字符串。

在此处阅读有关 MultiBindings 的教程,粗略的代码应如下所示:

<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 回答