Привязка текстового поля WPF и разрывы строк - PullRequest
5 голосов
/ 14 июля 2009

У меня есть текстовое поле, которое я связываю со строковым свойством viewmodel. Свойство string обновляется в модели представления, и оно отображает текст в текстовом поле посредством привязки.

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

Я попытался добавить \ r \ n внутри свойства строки в viewmodel, но разрыв строки не отражается над текстовым полем (у меня для свойства Acceptsreturn установлено значение true внутри текстового поля)

Может кто-нибудь помочь.

Ответы [ 3 ]

6 голосов
/ 23 мая 2012

Решением для меня было использование HTML-кодированных строк ( ).

Line1
Line2

выглядит как

Line1
Line2

Из Наоки

3 голосов
/ 14 июля 2009

Я только что создал простое приложение, которое делает то, что вы описываете, и оно работало для меня.

XAML:

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition />
        </Grid.RowDefinitions>
        <TextBox Grid.Row="0" AcceptsReturn="True" Height="50"
            Text="{Binding Path=Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
        <Button Grid.Row="1" Click="Button_Click">Button</Button>
    </Grid>
</Window>

ViewModel:

class ViewModel : INotifyPropertyChanged
{
    private string text = string.Empty;
    public string Text
    {
        get { return this.text; }
        set
        {
            this.text = value;
            this.OnPropertyChanged("Text");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propName)
    {
        var eh = this.PropertyChanged;
        if(null != eh)
        {
            eh(this, new PropertyChangedEventArgs(propName));
        }
    }
}

Экземпляр ViewModel устанавливается как DataContext для Window. Наконец, реализация Button_Click():

private void Button_Click(object sender, RoutedEventArgs e)
{
    this.model.Text = "Hello\r\nWorld";
}

(Я понимаю, что представление не должно напрямую изменять свойство Text ViewModel, но это просто пример приложения.)

Это приводит к тому, что слово "Hello" в первой строке TextBox, а "World" во второй строке.

Может быть, если вы отправите свой код, мы увидим, что отличается от этого образца?

0 голосов
/ 23 декабря 2015

Мне нравится @Andy Approach, он идеально подходит для мелкого текста, а не для большого текста с прокруткой.

Просмотр модели

class ViewModel :INotifyPropertyChanged
{
    private StringBuilder _Text = new StringBuilder();
    public string Text
    {
        get { return _Text.ToString(); }
        set
        {
            _Text = new StringBuilder( value);
            OnPropertyChanged("Text");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propName)
    {
        var eh = this.PropertyChanged;
        if(null != eh)
        {
            eh(this,new PropertyChangedEventArgs(propName));
        }
    }
    private void TextWriteLine(string text,params object[] args)
    {
        _Text.AppendLine(string.Format(text,args));
        OnPropertyChanged("Text");
    }

    private void TextWrite(string text,params object[] args)
    {
        _Text.AppendFormat(text,args);
        OnPropertyChanged("Text");
    }

    private void TextClear()
    {
        _Text.Clear();
        OnPropertyChanged("Text");
    }
}

Теперь вы можете использовать TextWriteLine, TextWrite и TextClear в MVVM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...