В элементах ListBox, созданных моим кодом, нет содержимого - PullRequest
0 голосов
/ 04 июля 2019

У меня есть окно, сгенерированное кодом в WPF (с использованием dotnet core 3.0 preview 6), и при запуске мое приложение получает правильные данные, а ListBox заполняется правильным количеством строк, но ни одна из них не содержит значений

Это тестовый проект, который я делаю, чтобы познакомиться с сгенерированным кодом WPF, поскольку он необходим для предстоящего проекта, который мы делаем на работе;Я бы предпочел использовать XAML, но мой ведущий говорит, что это создаст проблемы с возможностью повторного использования кода.

Сначала я убедился, что я использую «чистый» объект (мои сущности настроены для Linq2db, поэтому я удостоверился, что атрибуты не могли быть виновником), затем я протестировал привязку (только что получил код ошибки «Ошибка 40», но это не относится к основной проблеме).Я также изменил тип блоков, но это не помогает (DataGrid работал, но это не то, что я ищу в визуале).

public class ChatWindow : IChatWindow
{
    private ObservableCollection<MessageDto> _observableMessages;
    private readonly IMessagesRepository _messagesRepository;

    public ChatWindow(IMessagesRepository messagesRepository)
    {
        _messagesRepository = messagesRepository;

        Task.Run(async () => { await Updater(); }).ConfigureAwait(false);
    }

    public async Task ShowAsync(User user)
    {
        var chatLog = new ListBox()
        {
            Name = "Chatview",
            ItemsSource = _observableMessages,
            ItemTemplate = new DataTemplate(typeof(MessageDto)),
            DataContext = _observableMessages
        };

        //var myBinding = new Binding("_observableMessages");
        //myBinding.Source = _observableMessages;
        //chatLog.SetBinding(ListBox.ItemsSourceProperty, myBinding);

        var input = new TextBox()
        {
            Name = "InputField",
            Background = new SolidColorBrush(Color.FromRgb(35, 35, 35))
        };

        var stackPanel = new StackPanel()
        {
            Children =
            {
                chatLog,
                input
            }
        };

        var window = new Window()
        {
            Name = "ChatWindow",
            Content = stackPanel,
        };

        window.Show();
    }

    private async Task Updater()
    {
        while (true)
        {
            var messages = await _messagesRepository.GetAllMessages(1);
            _observableMessages = new ObservableCollection<MessageDto>(messages.Select(m => new MessageDto()
            {
                Timestamp = m.Timestamp,
                From = m.From,
                Message = m.Message
            }));
            await Task.Delay(TimeSpan.FromSeconds(10));
        }
    }
}

class MessageDto
{
    public DateTime Timestamp { get; set; }
    public long From { get; set; }
    public string Message { get; set; }
}

Изображение результирующего окна, (некоторыекод стиля был удален из примера кода, чтобы уменьшить шум) enter image description here

1 Ответ

0 голосов
/ 04 июля 2019

Основываясь на комментарии Флитора , я сделал это, и он отлично работал:

private DataTemplate GetDataTemplate()
    {
        var dataTemplate = new DataTemplate(typeof(MessageDto));

        FrameworkElementFactory stackPanelFactory = new FrameworkElementFactory(typeof(StackPanel));
        stackPanelFactory.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal);

        FrameworkElementFactory timestamp = new FrameworkElementFactory(typeof(Label));
        timestamp.SetBinding(Label.ContentProperty, new Binding("Timestamp"));
        FrameworkElementFactory from = new FrameworkElementFactory(typeof(Label));
        from.SetBinding(Label.ContentProperty, new Binding("From"));
        FrameworkElementFactory message = new FrameworkElementFactory(typeof(Label));
        message.SetBinding(Label.ContentProperty, new Binding("Message"));
        stackPanelFactory.AppendChild(timestamp);
        stackPanelFactory.AppendChild(from);
        stackPanelFactory.AppendChild(message);

        dataTemplate.VisualTree = stackPanelFactory;

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