微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将文本块绑定到两个属性

如何解决将文本块绑定到两个属性

| 我有一个绑定到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}\"
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。