如何在 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 元素意识到它们必须自我更新。
确实需要您的帮助来动态更新 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 元素意识到它们必须自我更新。