我有一个Textblock绑定到ItemsSource集合中的属性。我想在同一个文本块中显示该类的两个属性,但似乎我一次只能执行一个绑定。 我目前有这个:
Text="{Binding Title}"
但是我希望我想附加另一个属性,所以理论上它应该是:
Text="{Binding Title - Author}"
输出看起来像“莎士比亚 - 罗密欧与朱丽叶”。我已经尝试添加逗号,另一个绑定和其他东西,但它们都会导致抛出异常(例如元素TextBlock上的未知属性Text)。
两个属性都来自同一个类,因此我不需要有两个数据源。
答案 0 :(得分:17)
使用这个..它将完美地工作。
<TextBlock>
<Run Text="{Binding Title}"></Run>
<Run Text=":"></Run>
<Run Text="{Binding Author}"></Run>
</TextBlock>
输出将是这样的,
OOPS:Balagurusamy
答案 1 :(得分:8)
不幸的是,Silverlight缺少一些可以处理这个问题的WPF。我可能会使用值转换器,您可以传递包含标题和作者的类来格式化文本。
以下是代码:
public class TitleAuthorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (!(value is Book)) throw new NotSupportedException();
Book b = value as Book;
return b.Title + " - " + b.Author;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
public class Book
{
public string Title { get; set; }
public string Author { get; set; }
}
还有一些XAML:
<Grid x:Name="LayoutRoot" Background="White">
<Grid.Resources>
<local:Book Title="Some Book" Author="Some Author" x:Key="MyBook"/>
<local:TitleAuthorConverter x:Key="Converter"/>
</Grid.Resources>
<TextBlock DataContext="{StaticResource MyBook}" Text="{Binding Converter={StaticResource Converter}}"/>
</Grid>
这种方式的缺点是,如果属性发生更改(即实现INotifyPropertyChanged),则不会更新文本,因为该字段已绑定到类。
正如对该问题的评论中所建议的那样,您还可以创建一个组合它们的第三个属性。这将不得不使用多重绑定或值转换器。
答案 2 :(得分:4)
听起来你需要MultiBinding。
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} - {1}">
<Binding Path="Title" />
<Binding Path="Author" />
</MultiBinding>
</TextBlock.Text>
答案 3 :(得分:0)
我在网上找到了一个针对Silverlight的MultiBinding示例项目,其中有一些我相信,只有谷歌它。如果你找不到一个让我知道我会发给你我们正在使用的那个。
有谁知道多重绑定是否会进入SL 5?您也可以使用第三个属性,只要记住它的PropertyChanged
事件,当其中任何一个成分发生变化时,绑定就可以了。
答案 4 :(得分:0)
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} - {1}">
<Binding Path="Title" />
<Binding Path="Author" />
</MultiBinding>
答案 5 :(得分:0)
如果要在UI中显示它的文本是只读的,您可以尝试覆盖视图模型对象的ToString并返回组合值。
返回Titile +“:”+作者;
答案 6 :(得分:0)
一个非常简单的解决方案是在ViewModel中有一个属性,如下所示:
public string TextblockDataProvider
{
get
{
return string.Format("{0} - {1}", Title, Author);
}
set { ; }
}
并绑定xaml:
Text="{Binding TextblockDataProvider}"
答案 7 :(得分:0)
您可以使用CodeProject
中的特殊扩展程序实施例
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} {1}" >
<Binding Path="FirstName" />
<Binding Path="LastName" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>