Skip to main content
 首页 » 编程设计

c#之绑定(bind)的 DataGrid 不更新集合更改

2024年02月03日28bonelee

我是 WPF 的菜鸟。希望我能找到答案。

例如, 我有一个 List<Customer> ,并且它绑定(bind)到 dataGrid。如果我将新客户添加到列表中,但我没有看到数据网格在那里添加新行。

<DataGrid ItemsSource="{Binding Customers}" AutoGenerateColumns="False" Height="318"> 
    <DataGrid.Columns> 
        <DataGridTextColumn Header="First Name" Binding="{Binding FirstName, Mode=TwoWay}" /> 
        <DataGridTemplateColumn Header="Image" Width="SizeToCells" IsReadOnly="True"> 
            <DataGridTemplateColumn.CellTemplate> 
                <DataTemplate> 
                    <Image Height="80" Source="{Binding Image,Mode=TwoWay}" /> 
                </DataTemplate> 
            </DataGridTemplateColumn.CellTemplate> 
        </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.ComponentModel; 
using System.Windows.Data; 
 
namespace DataGrid 
{ 
    public class MainWindowViewModel 
    { 
        public ICollectionView Customers { get; private set; } 
        public ICollectionView GroupedCustomers { get; private set; } 
        public List<Customer> _customers { get; set; } 
 
        public MainWindowViewModel() 
        { 
            _customers = new List<Customer> 
                             { 
                                 new Customer 
                                     { 
                                         FirstName = "Christian", 
                                         LastName = "Moser", 
                                         Gender = Gender.Male, 
                                         WebSite = new Uri("http://www.wpftutorial.net"), 
                                         ReceiveNewsletter = true, 
                                         Image = "Images/christian.jpg" 
                                     }, 
                                 new Customer 
                                     { 
                                         FirstName = "Peter", 
                                         LastName = "Meyer", 
                                         Gender = Gender.Male, 
                                         WebSite = new Uri("http://www.petermeyer.com"), 
                                         Image = "Images/peter.jpg" 
                                     }, 
                                 new Customer 
                                     { 
                                         FirstName = "Lisa", 
                                         LastName = "Simpson", 
                                         Gender = Gender.Female, 
                                         WebSite = new Uri("http://www.thesimpsons.com"), 
                                         Image = "Images/lisa.jpg" 
                                     }, 
                                 new Customer 
                                     { 
                                         FirstName = "Betty", 
                                         LastName = "Bossy", 
                                         Gender = Gender.Female, 
                                         WebSite = new Uri("http://www.bettybossy.ch"), 
                                         Image = "Images/betty.jpg" 
                                     } 
                             }; 
            Customers = CollectionViewSource.GetDefaultView(_customers); 
            GroupedCustomers = new ListCollectionView(_customers); 
            GroupedCustomers.GroupDescriptions.Add(new PropertyGroupDescription("Gender"));          
        } 
    } 
} 
 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 
using System.Reflection; 
 
namespace DataGrid 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
        private new MainWindowViewModel view { get; set; } 
        public MainWindow() 
        { 
            InitializeComponent(); 
            view = new MainWindowViewModel(); 
            DataContext = view; 
        } 
 
        private void button1_Click(object sender, RoutedEventArgs e) 
        { 
            view._customers.Add(new Customer 
                                { 
                                    FirstName = "Lei", 
                                    LastName = "Moser", 
                                    Gender = Gender.Male, 
                                    WebSite = new Uri("http://www.wpftutorial.net"), 
                                    ReceiveNewsletter = true, 
                                    Image = "Images/christian.jpg" 
                                }); 
        } 
    } 
} 
 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.ComponentModel; 
 
namespace DataGrid 
{     
    public enum Gender 
    { 
        Male,  
        Female 
    } 
 
    public class Customer : INotifyPropertyChanged 
    { 
        private string _firstName; 
        private string _lastName; 
        private Gender _gender; 
        private Uri _webSite; 
        private bool _newsletter; 
        private string _image; 
 
        public string FirstName 
        { 
            get { return _firstName; } 
            set  
            { 
                _firstName = value; 
                NotifyPropertyChanged("FirstName"); 
            } 
        } 
 
        public string LastName 
        { 
            get { return _lastName; } 
            set 
            { 
                _lastName = value; 
                NotifyPropertyChanged("LastName"); 
            } 
        } 
 
        public Gender Gender 
        { 
            get { return _gender; } 
            set 
            { 
                _gender = value; 
                NotifyPropertyChanged("Gender"); 
            } 
        } 
 
        public Uri WebSite 
        { 
            get { return _webSite; } 
            set 
            { 
                _webSite = value; 
                NotifyPropertyChanged("WebSite"); 
            } 
        } 
 
        public bool ReceiveNewsletter 
        { 
            get { return _newsletter; } 
            set 
            { 
                _newsletter = value; 
                NotifyPropertyChanged("Newsletter"); 
            } 
        } 
 
        public string Image 
        { 
            get { return _image; } 
            set 
            { 
                _image = value; 
                NotifyPropertyChanged("Image"); 
            } 
        } 
 
        #region INotifyPropertyChanged Members 
        public event PropertyChangedEventHandler PropertyChanged; 
        #endregion 
 
        #region Private Helpers 
        private void NotifyPropertyChanged(string propertyName) 
        { 
            if (PropertyChanged != null) 
            { 
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
            } 
        } 
        #endregion 
    } 
} 

我将 bindingMode 设置为 TwoWay 并且我有一个 button_onClick 并且只是将一个新客户添加到绑定(bind)列表中,但是我没有看到 Datagrid 为它添加一个新行。
谁能帮忙?

请您参考如下方法:

问题是 List<T>不执行 INotifyCollectionChanged .否则,没有任何内容会告诉 WPF 已添加新项目。

此处最好的选择是将类更改为使用 ObservableCollection<T>而不是 List<T> .这将导致 WPF 在集合中添加或删除项目时自动收到通知,并且会适当更新。