如何在 WPF 中将 INotifyPropertyChanged 数据与 DataGrid 绑定?

How to bind INotifyPropertyChanged data with DataGrid in WPF?

确实需要您的帮助来动态更新 table。

这里是和INotifyPropertyChanged数据“Table”相关的table,后面会讲到DataContext是和mainVM相关的。通过这种方式,我试图显示在程序执行期间可能会发生变化的 table。

所以这是我的 xaml 部分:

<DataGrid DataContext="{Binding Table, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}" Grid.Column="0" CanUserAddRows="false" AutoGenerateColumns="False" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" MinHeight="500">

            <!-- Column Header Text & Bindings -->
            <DataGrid.Columns>

                <DataGridTemplateColumn >
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox x:Name="checkBox" IsThreeState="False" IsChecked="{Binding IsChecked}" CommandParameter="{Binding Index}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTextColumn Header=" Port" Binding="{Binding Port}" MinWidth="70"/>
                <DataGridTextColumn Header=" Host" Binding="{Binding Host}" MinWidth="70"/>
                <DataGridTextColumn Header=" IPv4" Binding="{Binding IPV4}" MinWidth="70"/>
                <DataGridTextColumn Header=" IPv6" Binding="{Binding IPV6}" MinWidth="70"/>
                ...
            </DataGrid.Columns>
        </DataGrid>

这就是 ViewModel 代码(省略号表示在 class 个字段的描述中有一些遗漏):

    public class RowVM : ObservableObject
    {
        private string _port;
        private string _host;
        private string _ipv4;
        private string _ipv6;
        ...

        public string Port
        {
            get { return _port; }
            set 
            { 
                _port = value;
                OnPropertyChanged("Port");
            }
        }
        ...
     }

    public class MainViewModel : ObservableObject
    {
        public List<RowVM> Table { get; set; }

        public MainViewModel()
        {
            Table = new List<RowVM>();
        }
    }

所以看起来一切都已链接。 但是我毕竟看不到table中的项目:(也没有例外。

这是我的起始正文:

public partial class MainWindow : Window
    {
        MainViewModel _mainVM = new MainViewModel();
        public MainWindow()
        {
            InitializeComponent();
            DataContext = _mainVM;

            RowVM row1 = new RowVM() { SN = "001" };
            RowVM row2 = new RowVM() { SN = "010" };
            _mainVM.Table.Add(row1);
            _mainVM.Table.Add(row2);
        }
        
    }

请告诉我,我做错了什么?

P.S。 INotifyPropertyChanged 的​​实现 shell:

public class ObservableObject : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string name)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
    }

您的 window 不知道您何时向 Table 添加或删除时间。您应该使用 ObservableCollection<RowVM> 而不是 List<RowVM>。每当添加或删除项目时,它都会调用一个事件。这允许 GUI 元素意识到它们必须自我更新。