问题描述
|
我有一个绑定到ItemsSource集合中的属性的Textblock。我想在同一个文本块中显示该类的两个属性,但是看来我一次只能执行一个绑定。
我目前有这个:
Text=\"{Binding Title}\"
但我想添加另一个属性,因此理论上是:
Text=\"{Binding Title - Author}\"
输出看起来像“莎士比亚-罗密欧与朱丽叶”。我曾尝试添加逗号,其他绑定和其他内容,但它们都会导致引发异常(例如,元素TextBlock上的UnkNown属性Text)。
这两个属性都来自同一类,因此我不需要两个数据源。
解决方法
不幸的是,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,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),则由于字段绑定到类,您将无法更新文本。
如对问题的评论所建议,您还可以创建将它们组合在一起的第三个属性。这将避免必须使用多重绑定或值转换器。
, 使用这一..它将完美地工作。
<TextBlock>
<Run Text=\"{Binding Title}\"></Run>
<Run Text=\":\"></Run>
<Run Text=\"{Binding Author}\"></Run>
</TextBlock>
输出将是这样,
OOPS:巴拉古萨米
, 听起来您需要一个MultiBinding。
<TextBlock.Text>
<MultiBinding StringFormat=\"{}{0} - {1}\">
<Binding Path=\"Title\" />
<Binding Path=\"Author\" />
</MultiBinding>
</TextBlock.Text>
, 您可以使用CodeProject中的特殊扩展名
例
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat=\"{}{0} {1}\" >
<Binding Path=\"FirstName\" />
<Binding Path=\"LastName\" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
, 我在网上找到了一个针对Silverlight的MultiBinding示例项目,我相信其中有很多,只是Google。如果您找不到一个,请告诉我,我们将给您发送我们正在使用的那个。
有人知道SL 5即将推出多重装订吗?您也可以使用3rd属性,只要记住任何一个成分更改时都触发它的PropertyChanged
事件,然后绑定就可以了。
, <TextBlock.Text>
<MultiBinding StringFormat=\"{}{0} - {1}\">
<Binding Path=\"Title\" />
<Binding Path=\"Author\" />
</MultiBinding>
, 如果要在UI中显示的Text是只读的,则可以尝试覆盖视图模型对象的ToString并返回组合的值。
返回Titile + \“:\” +作者;
, 一个非常简单的解决方案是在ViewModel中具有如下属性:
public string TextblockDataProvider
{
get
{
return string.Format(\"{0} - {1}\",Title,Author);
}
set { ; }
}
并绑定在xaml中:
Text=\"{Binding TextblockDataProvider}\"