Estoy tratando de vincular un cuadro de lista a un modelo de vista con el siguiente código:

Xaml

<Window x:Class="WpfMessenger.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfMessenger"
    mc:Ignorable="d"
    Title="Messenger" Height="450" Width="800">

  <DockPanel>
    <ListBox x:Name="listBox" ItemsSource="{Binding Messages}" DisplayMemberPath="MsgContent" />
  </DockPanel>
</Window>

C #

public MainWindow()
    {
        InitializeComponent();
        var viewModel = new ViewModel();
        DataContext = viewModel;
    }

public class Message: INotifyPropertyChanged
{
    private string _from;
    private string _msgContent;

    private String From
    {
        get => _from;
        set
        {
            _from = value;
            NotifyPropertyChanged();
        }
    }
    private String MsgContent
    {
        get => _msgContent;
        set
        {
            _msgContent = value;
            NotifyPropertyChanged();
        }
    }

    public Message(string from, string content)
    {
        From = from;
        MsgContent = content;

    }

    public override string ToString()
    {
        return MsgContent;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void NotifyPropertyChanged([CallerMemberName] string propName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
    }
}
public class ViewModel
{
    ObservableCollection<Message> _messages = new ObservableCollection<Message>();
    public ObservableCollection<Message> Messages => _messages;
    public ViewModel()
    {
        var dispatcherTimer = new DispatcherTimer();
        dispatcherTimer.Tick += DispatcherTimerOnTick;
        dispatcherTimer.Interval = new TimeSpan(0, 0, 1);
        dispatcherTimer.Start();
    }
    private void DispatcherTimerOnTick(object sender, EventArgs e)
    {
        Messages.Add(new Message("1234", DateTime.Now.ToLongTimeString()));
    }
}

enter image description here

Cuando corro, aunque todo parece estar correcto, no veo ningún dato. Los elementos parecen invisibles. Si elimino DisplayMemberPath = "MsgContent", veo datos porque anulo la función ToString. Estoy perplejo.

Tia

-1
Jeff 11 oct. 2020 a las 21:51

1 respuesta

La mejor respuesta

Cambiar el nivel de acceso para hacerlo público, no privado

public String MsgContent
        {
            get => _msgContent;
            set
            {
                _msgContent = value;
                NotifyPropertyChanged();
            }
        }
1
Ibram Reda 11 oct. 2020 a las 19:15