XAML中的数据绑定(多路绑定?)

时间:2012-09-29 22:33:33

标签: c# .net wpf xaml binding

假设我有一个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; }
}

希望我能:

  

单击ListBox中的项目,具有相应项目的名称和   内容属性显示在各自的TextBox中,然后显示   在内容文本框中附加词典的键/值   内容。

但我不知道我怎么能这么深。有点像我会走多层次,像多维绑定这样的东西是我需要的吗?

您有或已经看过任何(简单)样品吗?文档,文章,教程?

非常感谢任何帮助。

谢谢

1 个答案:

答案 0 :(得分:3)

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

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

阅读tutorial about MultiBindings here,粗略的代码应如下所示:

<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. 字典没有通知。如果基础字典在显示时发生更改,则不会发生任何更改
  3. 如果你认为这些,那么MultiBinding可能就是你需要的工具。