我的代码生成的 ListBox 的项目没有显示任何内容

My code-generated ListBox's items isn't showing any content

我在 WPF 中有一个代码生成的 window(使用 dotnet core 3.0 预览版 6),当 运行 我的应用程序获得正确的数据时,ListBox 填充了正确的数据行数,但其中 none 包含值

这是我正在做的一个测试项目,目的是熟悉代码生成的 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; }
}

生成的图像 window,(从示例代码中删除了一些样式代码以减少噪音)

根据 Flithor's 评论,我这样做了并且效果很好:

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;
    }