[英]Bind List<object> to Datagrid WPF, C#
我对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>
我的文件: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; }
}
如果我以编程方式设置itemssource,它将起作用:
dgVarConfig.Itemssource = mainController.loadVarConfigList();
但这不是我想要的,因为我想通过网格更新列表(插入,删除,更新行=> Mode = TwoWay)
任何线索,我怎么能通过XAML填充itemsource?
创建一个具有包含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=TwoWay
或UpdateSourceTrigger=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#属性名已被广泛接受。
您将必须将DataGrid
的DataContext
设置为其中包含varConfigList
任何对象。 然后, DataGrid
将能够看到varConfigList
并完成它的工作。 您不会提供很多代码,所以我看不到您想要什么,但是我将做出一些猜测,看看它们是否有帮助。
有几种方法可以做到这一点。 我认为DataGrid
在您的MainWindow
,因此它将通常从那里继承其DataContext
。 但您也可以单独设置。
这是一种可能的方法:
主窗口
<Window ...>
<DataGrid ... ItemsSource={Binding VarConfigList} ... />
</Window>
public partial class MainWindow : Window
{
...
MainWindow()
{
InitializeComponent();
this.DataContext = new MainController();
}
}
主控制器
class MainControler
{
private var _varConfigList;
public var VarConfgList { get { return _varConfigList; } }
...
public MainControler()
{
// set stuff up
}
}
然后,您的下一个问题是如何使DataGrid
VarConfigList
地对待VarConfigList
,但这是另一回事了。
以我有限的经验,整理DataContexts是学习WPF的最大障碍。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.