Как добавить данные в RichTextBox из двух источников данных в WPF - PullRequest
1 голос
/ 30 января 2010

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

Есть ли возможность сделать это в WPF?

1 Ответ

1 голос
/ 30 января 2010

Вы не можете связать (или мультибиндинг) с Document свойством RichTextBox, потому что это НЕ DependencyProperty (странно !!!) !!! См. эту ссылку для действительно простого способа создания подкласса RichTextBox для создания собственного BindableRichTextBox или этого сообщения для другого обходного пути .

Теперь вы можете использовать MultiBinding с пользовательским IMultiValueConverter для достижения результатов. Поскольку вы не предоставили подробных сведений о своей проблеме, я могу лишь дать вам общее представление о том, что вам следует делать:

<!--NOTE: Include xmlns:local=" .. " appropriately for your project-->
<Window.Resources>
    <sys:String x:Key="SourceA">This text will be normal..</sys:String>
    <sys:String x:Key="SourceB">This text will be Bold!!!</sys:String>
</Window.Resources>

А теперь вы можете сделать так:

<local:BindableRichTextBox>
    <!--<local:BindableRichTextBox.Document>-->
        <MultiBinding Converter="{x:Static local:MySourceBToBoldConverter.Instance}">
            <Binding Source="{StaticResource SourceA}" />
            <Binding Source="{StaticResource SourceB}" />
        </MultiBinding>
    <!--</local:BindableRichTextBox.Document>-->
</local:BindableRichTextBox>

А затем создайте класс MySourceBToBoldConverter, который наследуется от IMultiValueConverter следующим образом:

public class MySourceBToBoldConverter : IMultiValueConverter
{
    public static readonly MySourceBToBoldConverter Instance = new MySourceBToBoldConverter();

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        //Now you'll get value from Source A as value[0]
        //           and value from Source B as value[1]
        //Do whatever you want like bold etc...
        //and return the result

        string normalText = values[0] as string;
        string boldText = values[1] as string;

        Bold bold = new Bold();
        bold.Inlines.Add(boldText);

        Paragraph para = new Paragraph();
        para.Inlines.Add(normalText);
        para.Inlines.Add(bold);

        FlowDocument rtbDocument = new FlowDocument();
        rtbDocument.Blocks.Add(para);

        return rtbDocument;
    }

    public object[] ConvertBack(object value, ... )
    {
        //Convert the object returned by Convert() back 
        //to its original form if it's possible;
        //otherwise throw not supported exception ;)

        throw new NotImplementedException();
    }
}

В настоящее время у меня нет рабочего ПК, на котором установлена ​​VS, поэтому я не могу привести рабочий пример, но продолжайте поиск в google / msdn / stackoverflow 4 MultiBinding и IMultiValueConverter и вы найдете несколько хороших примеров.

Проверьте рабочий пример здесь .

С уважением,
Михир Гокани

...