Привязать текстовый блок к двум свойствам - PullRequest
12 голосов
/ 15 июня 2011

У меня есть Textblock, который связан со свойством в коллекции ItemsSource.Я хотел бы отобразить два свойства из этого класса в одном и том же текстовом блоке, но, похоже, я могу выполнить только одно связывание за раз.В настоящее время у меня есть это:

Text="{Binding Title}"

, но я хочу добавить другое свойство, поэтому теоретически это будет:

Text="{Binding Title - Author}" 

с выводом, похожим на «Шекспир - Ромео иДжульетта".Я попытался добавить запятую, другую привязку и другие вещи, но все они приводят к возникновению исключения (например, неизвестный атрибут Text для элемента TextBlock).

Оба свойства принадлежат одному и тому же классу, поэтому я выигралне нужно иметь два источника данных.

Ответы [ 8 ]

17 голосов
/ 02 ноября 2012

Используйте это .. Это будет работать отлично.

<TextBlock>
    <Run Text="{Binding Title}"></Run>
    <Run Text=":"></Run>
    <Run Text="{Binding Author}"></Run> 
</TextBlock>

вывод будет таким,

OOPS: Balagurusamy

8 голосов
/ 15 июня 2011

К сожалению, 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), поскольку поле привязано к классу.

Как предлагается в комментариях к вопросу, вы также можете создать третье свойство, которое объединяет их. Это позволит обойтись без использования мультибиндингов или преобразователей значений.

4 голосов
/ 15 июня 2011

Похоже, вам нужно MultiBinding .

<TextBlock.Text>
    <MultiBinding StringFormat="{}{0} - {1}">
        <Binding Path="Title" />
        <Binding Path="Author" />
    </MultiBinding>
</TextBlock.Text>
0 голосов
/ 05 февраля 2016

Вы можете использовать специальное расширение от CodeProject

Пример

<TextBlock>
<TextBlock.Text>
    <MultiBinding StringFormat="{}{0} {1}" >
        <Binding Path="FirstName" />
        <Binding Path="LastName" />
    </MultiBinding>
</TextBlock.Text>
</TextBlock>
0 голосов
/ 04 августа 2015

Очень простое решение будет иметь свойство в вашей ViewModel, как это:

        public string TextblockDataProvider
    {
        get
        {
            return string.Format("{0} - {1}", Title, Author);
        }
        set { ; }
    }

и привязка в xaml:

Text="{Binding TextblockDataProvider}"
0 голосов
/ 31 декабря 2013

Если текст, который вы хотите отобразить в пользовательском интерфейсе, доступен только для чтения, вы можете попробовать переопределить ToString вашего объекта модели представления и вернуть объединенное значение.

return Titile + ":" + Author;

0 голосов
/ 17 декабря 2012
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} - {1}">
    <Binding Path="Title" />
    <Binding Path="Author" />
</MultiBinding>

0 голосов
/ 17 июня 2011

Я нашел в сети пример проекта MultiBinding для Silverlight, я верю, что есть целый ряд из них, просто Google.Если вы не можете найти один, дайте мне знать, я пришлю вам тот, который мы используем.Кто-нибудь знает, подходит ли мульти-связывание к SL 5?Вы также можете использовать 3-е свойство, просто не забывайте вызывать его событие PropertyChanged, когда когда-либо изменяется его составляющая, тогда связывание будет в порядке.

...