将嵌套对象绑定到c#WPF中的DataGrid

时间:2014-06-28 03:49:47

标签: c# wpf xaml datagrid

我正在尝试将DataGrid中显示的数据绑定到另一个对象(WhisperReader)中的对象(WhisperModel)的动态列表。 DataGrid仅显示标题,但没有值。当列表“耳语”发生变化时,如何使DataGrid自动动态更新?

主窗口XAML:

<DataGrid x:Name="whisperDataGrid" Margin="10,69,10,10" IsReadOnly="True" ItemsSource="{Binding}"/>

主窗口C#

public partial class MainWindow : Window
{
    private WhisperReader wr;
    public MainWindow()
    {
        InitializeComponent();
        wr = new WhisperReader();
        whisperDataGrid.DataContext = wr.whispers;
    }

WhisperReader:

class WhisperReader
{
    public ObservableCollection<WhisperModel> whispers { get; private set; }

    public WhisperReader()
    {
        whispers = new ObservableCollection<WhisperModel>();
    }

WhisperModel:

class WhisperModel
{
    public DateTime sentTime { get; set; }
    public string sender { get; set; }
    public string message { get; set; }
}

1 个答案:

答案 0 :(得分:1)

我认为你的问题是它不知道何时更新,因为:

  1. 您已将窃听者列出数据上下文。
  2. 您要绑定的属性不使用INotifyPropertyChanged。
  3. WhisperReader和WhisperModel不公开
  4. 所有绑定必须是公共的,必须是属性,并且必须调用PropertyChanged方法。 PropertyChanged函数会触发绑定更新。

    试试这个......

    public partial class MainWindow : Window
    {
        private WhisperReader wr;
        public MainWindow()
        {
            InitializeComponent();
            wr = new WhisperReader();
            whisperDataGrid.DataContext = wr;
        }
    
    public class WhisperReader : INotifyPropertyChanged
    {
        ObservableCollection<WhisperModel> _whispers;
        public ObservableCollection<WhisperModel> whispers 
        { 
          get { return _whispers; } 
          private set 
          {
             _whispers = value;
             NotifyPropertyChanged(); 
          }
        }
    
        public WhisperReader()
        {
            whispers = new ObservableCollection<WhisperModel>();
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    
    
    public class WhisperModel : INotifyPropertyChanged
    {
        public DateTime sentTime { get; set; }
    
        private string _sender;
        public string sender 
        { 
            get { return _sender; } 
            set { _sender = value; NotifyPropertyChanged();
        }
    
        private string _message;
        public string message 
        { 
            get { return _message; } 
            set { _message = value; NotifyPropertyChanged();
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    <DataGrid x:Name="whisperDataGrid" Margin="10,69,10,10" IsReadOnly="True" AutoGenerateColumns="True" ItemsSource="{Binding whispers}"/>