将文本块绑定到两个属性

时间:2011-06-15 17:20:29

标签: c# silverlight xaml binding textblock

我有一个Textblock绑定到ItemsSource集合中的属性。我想在同一个文本块中显示该类的两个属性,但似乎我一次只能执行一个绑定。 我目前有这个:

Text="{Binding Title}"

但是我希望我想附加另一个属性,所以理论上它应该是:

Text="{Binding Title - Author}" 

输出看起来像“莎士比亚 - 罗密欧与朱丽叶”。我已经尝试添加逗号,另一个绑定和其他东西,但它们都会导致抛出异常(例如元素TextBlock上的未知属性Text)。

两个属性都来自同一个类,因此我不需要有两个数据源。

8 个答案:

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