将 List<object> 绑定到 Datagrid WPF、C#

Tho*_*mer 1 c# wpf xaml datagrid

我对 WPF 完全陌生,所以这是我的代码:

 <DataGrid x:Name="dgVarConfig" ItemsSource="{Binding varConfigList, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Margin="10,59,0,0" VerticalAlignment="Top" Height="403" Width="1278" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeRows="False" HeadersVisibility="Column">

            <DataGrid.Columns>
                <DataGridTextColumn  Width="auto" Header="Match Ausdruck" Binding="{Binding match_expression}"></DataGridTextColumn>
            </DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)

我的文件:MainWindow.xaml、MainController.cs、VarConfigDAO.cs

varConfigDAO.cs 将列表返回到 MainController,MainController.cs 将其返回到 MainWindows.xaml。

这是 VarConfig.cs:

 public class VarConfig
    {
        public int id { get; set; }
        public String group { get; set; }
        public String machine { get; set; }
        public String match_expression { get; set; }
        public String variant_new_1 { get; set; }
        public String calc_formula_1 { get; set; }
        public String variant_new_2 { get; set; }
        public String calc_formula_2 { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

如果我以编程方式设置 itemssource ,它会起作用:

dgVarConfig.Itemssource = mainController.loadVarConfigList();
Run Code Online (Sandbox Code Playgroud)

但这不是我想要的,因为我想通过网格更新列表(插入、删除、更新行=> Mode=TwoWay)

我知道如何通过 xaml 填充 itemssource 吗?

Cle*_*ens 6

创建一个具有保存对象集合的属性的视图模型类VarConfig。集合应该通知视图有关更改(例如添加或删除的元素)。因此,合适的集合类型是 ObservableCollection:

public class ViewModel
{
    public ViewModel()
    {
        VarConfigList = new ObservableCollection<VarConfig>();
    }

    public ObservableCollection<VarConfig> VarConfigList { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)

将 UI(例如 MainWindow)设置DataContext为视图模型的实例,例如在 MainWindow 构造函数后面的代码中,如下所示:

public MainWindow()
{
    InitializeComponent();

    var viewModel = new ViewModel();
    // fill viewModel.VarConfigList

    DataContext = viewModel;
}
Run Code Online (Sandbox Code Playgroud)

绑定到VarConfigListXAML 中的属性。没有必要设置Mode=TwoWayUpdateSourceTrigger=PropertyChanged,因为该ItemsSource属性仅单向绑定(DataGrid - 或任何其他 ItemsControl - 从不设置它):

<DataGrid ItemsSource="{Binding VarConfigList}" ...>
    ...
</DataGrid>
Run Code Online (Sandbox Code Playgroud)

最后,如果您还希望 UI 对各个 VarConfig属性的更改做出反应,它应该实现该INotifyPropertyChanged接口:

public class VarConfig : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    private int id;
    public int Id
    {
        get { return id; }
        set
        {
            id = value;
            OnPropertyChanged("Id");
        }
    }

    // similar code for the other properties
}
Run Code Online (Sandbox Code Playgroud)

注意外壳。在PascalCase.