Как я могу изменить значение свойства строки в ViewModel? - PullRequest
0 голосов
/ 11 ноября 2019

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

Я думал что-то вроде этого:

public string Description 
{
    get 
    {
        int txtLen = Description?.Length ?? 0;
        int maxLen = 600;
        if (txtLen > 0)
        {
            string ellipsis = txtLen > maxLen ? "…" : "";
            return Description.Substring(0, txtLen > maxLen ? maxLen : txtLen) + ellipsis;
        }
        else
        { 
            return "";
        }
    }
    set 
    {
        Description = value;
    }
}

Код выше компилируется, но когда япопробуйте запустить его, приложение истекло с сообщением об ошибке «отказано в соединении». Если я изменяю свойство на public string Description { get; set; }, мое приложение запускается.

Мне нужен установщик, потому что в другом месте моего приложения я изменяю свойство Description в контроллере.

ОБНОВЛЕНИЕ

Спасибо Стиву за решение. Однако, когда усечение сработало, я понял, что иногда я действительно хочу, чтобы весь текст был в виде. Поэтому я сделал дополнительный метод, который использует оригинальный Description вместо private string _dsc:

public string Description { get; set; }

public string DescriptionTruncate(int maxLen)
{
    int txtLen = Description?.Length ?? 0;
    if (txtLen > 0)
    {
        string ellipsis = txtLen > maxLen ? "…" : "";
        return Description.Substring(0, txtLen > maxLen ? maxLen : txtLen) + ellipsis;
    }
    else
    {
        return "";
    }
}

Ответы [ 2 ]

4 голосов
/ 11 ноября 2019

Ваш код в методе доступа get вызовет исключение переполнения стека, поскольку для измерения длины в описании вы вызываете метод доступа get, и это никогда не закончится, пока переполнение стека не остановит ваш код.

Чтобы решитьпроблема в использовании внутренней переменной и работа с ней

private string _dsc = "";
public string Description
{
    get
    {
        int txtLen = _dsc.Length;
        int maxLen = 600;
        if (txtLen > 0)
        {
            string ellipsis = txtLen > maxLen ? "..." : "";
            return _dsc.Substring(0, txtLen > maxLen ? maxLen : txtLen) + ellipsis;
        }
        else
        {
            return "";
        }
    }
    set
    {
        _dsc = value;
    }
}
0 голосов
/ 11 ноября 2019

Не хотите ли вы сделать это в своем представлении с помощью css?

https://developer.mozilla.org/en-US/docs/Web/CSS/text-overflow

Мне это кажется чище, чем делать это в вашей модели представления.

...