Bind List<object> to Datagrid WPF, C#

本文关键字:WPF Datagrid to object List lt Bind gt | 更新日期: 2023-09-27 18:14:05

我对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>

我的文件:主窗口。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; }
    }

如果我以编程方式设置itemssource,它可以工作:

dgVarConfig.Itemssource = mainController.loadVarConfigList();

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

任何线索我如何可以填写itemssource通过xaml?

Bind List<object> to Datagrid WPF, C#

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

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

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

public MainWindow()
{
    InitializeComponent();
    var viewModel = new ViewModel();
    // fill viewModel.VarConfigList
    DataContext = viewModel;
}

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

<DataGrid ItemsSource="{Binding VarConfigList}" ...>
    ...
</DataGrid>

最后,如果您还希望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
}

注意大小写。在PascalCase中编写c#属性名是被广泛接受的。

您将不得不将DataGridDataContext设置为具有varConfigList的任何对象。然后,DataGrid将能够看到varConfigList并做它的事情。你没有给出很多代码,所以我不知道你想要什么,但我要做一些猜测,看看它们是否有帮助。

有几种方法可以做到这一点。我认为DataGrid在你的MainWindow中,所以它通常会从那里继承DataContext;但你也可以单独设置。

这是一种可能的方法:

主窗口

<Window ...>
    <DataGrid ... ItemsSource={Binding VarConfigList} ... />
</Window>
public partial class MainWindow : Window
{
  ...
  MainWindow()
  {
       InitializeComponent();
       this.DataContext = new MainController();
  }
}

MainController

class MainControler 
{
    private var _varConfigList;
    public var VarConfgList { get { return _varConfigList; } }
    ...
    public MainControler()
    { 
       // set stuff up 
    }
}

那么你的下一个问题是如何让DataGrid像你想要的那样对待VarConfigList,但那是另一个故事。

在我有限的经验中,整理DataContexts一直是学习WPF的最大障碍。