Binding WPF возвращает строку по умолчанию

1

Я хочу связать объект Info в моем столбце xaml:

<DataGridTextColumn Width="200" Binding="{Binding Path=Message.Info.InfoName, Mode=OneWay, TargetNullValue=No Information available}">
    <DataGridTextColumn.Header>
        <Label>Information</Label>
    </DataGridTextColumn.Header>
</DataGridTextColumn>

Для каждого сообщения у меня есть конструктор и в том же классе сообщений, у меня есть это свойство:

public IMessageInformation Info
{
    get
    {
        //if (_info == null)
        //  return "no info available";
        return _info;
    }

    set
    {
        _info = value;
        NotifyPropertyChanged("Info");
    }
}

Теперь для каждого сообщения столбец WPF должен отображать либо имя информации (получает из объекта Info (свойство Info.InfoName)), либо если сообщение не имеет информации (другого типа), оно должно отображать "Нет информации".

Если нет никакой информации, я не получаю никакого объекта (Info == null).


Моя проблема:

  • Если сообщение имеет информацию, свойство Info получает объект с именем и привязкой
  • Если сообщение не имеет информации, свойство Info не получает объекта, а столбец пуст.

Что я пробовал:

Я попытался вставить оператор if в свойство Info (getter). Заявление работает, но, конечно, я не могу вернуть строку, если свойство ожидает информацию об объекте возвращаемого типа.

И мой другой подход TargetNullValue=No Information available} тоже не работает.

Теги:
xaml
wpf

2 ответа

3
Лучший ответ

Вы должны добавить атрибут FallbackValue в свой XAML следующим образом:

Binding="{Binding
    Path=Message.Info.InfoName,
    Mode=OneWay,
    FallbackValue=No Information available}"

Это связано с тем, что ваше связывание не выполняется из-за того, что часть Info в вашем пути привязки имеет значение null. Вы должны увидеть совпадающую ошибку в вашем отладочном выходе.

  • 0
    Хорошо, но TargetNullValue проблему в этом случае, так как источник определен?
  • 1
    Нет, потому что источник не определен :). Источник определяется всем путем, а не его частью. И в этом случае путь не полностью заселен.
0

Зависит немного от того, как вы извлекаете данные, но одно решение может состоять в том, чтобы иметь свойство "InfoName" в сообщении, которое вы заполняете при извлечении данных.

List<Message> messages = context.Messages.Select(m => new Message
{
    InfoName = m.Info != null ? m.InfoName : "no info available",
    // etc.
})
.ToList();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню