假设我有一个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中,然后显示 在内容文本框中附加词典的键/值 内容。
但我不知道我怎么能这么深。有点像我会走多层次,像多维绑定这样的东西是我需要的吗?
您有或已经看过任何(简单)样品吗?文档,文章,教程?
非常感谢任何帮助。
谢谢
答案 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();
}
为什么我认为这是你需要的?
如果你认为这些,那么MultiBinding可能就是你需要的工具。