绑定列表<;对象>;到Datagrid WPF,C#

绑定列表<;对象>;到Datagrid WPF,C#,c#,wpf,xaml,datagrid,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" AutoGenera

我对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>
如果我将itemssource程序设置为:

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


有没有关于如何通过xaml填充itemssource的线索?

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

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

    public ObservableCollection<VarConfig> VarConfigList { get; private set; }
}
绑定到XAML中的
VarConfigList
属性。无需设置
Mode=TwoWay
UpdateSourceTrigger=PropertyChanged
,因为
ItemsSource
属性仅单向绑定(DataGrid-或任何其他ItemsControl-从不设置它):


注意外壳。人们普遍接受在
PascalCase

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

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

    public ObservableCollection<VarConfig> VarConfigList { get; private set; }
}
绑定到XAML中的
VarConfigList
属性。无需设置
Mode=TwoWay
UpdateSourceTrigger=PropertyChanged
,因为
ItemsSource
属性仅单向绑定(DataGrid-或任何其他ItemsControl-从不设置它):


注意外壳。在
PascalCase

中写入C#property name已被广泛接受。您必须将
DataGrid
DataContext
设置为其中包含
varConfigList
的任何对象。然后,
DataGrid
将能够查看
varConfigList
,并完成它的工作。你没有给出太多的代码,所以我看不出你想要什么,但我要做一些猜测,看看它们是否有用

有几种方法可以做到这一点。我认为
DataGrid
在您的
main窗口中,因此它通常会从那里继承其
DataContext
;但也可以单独设置

以下是一种可能的方法:

主窗口

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

public partial class MainWindow : Window
{
  ...
  MainWindow()
  {
       InitializeComponent();
       this.DataContext = new MainController();
  }
}
接下来的问题是如何让
DataGrid
根据需要处理
VarConfigList
,但这是另一回事


在我有限的经验中,整理数据上下文一直是学习WPF的最大障碍。

您必须将
DataGrid
DataContext
设置为其中包含
varConfigList
的任何对象。然后,
DataGrid
将能够查看
varConfigList
,并完成它的工作。你没有给出太多的代码,所以我看不出你想要什么,但我要做一些猜测,看看它们是否有用

有几种方法可以做到这一点。我认为
DataGrid
在您的
main窗口中,因此它通常会从那里继承其
DataContext
;但也可以单独设置

以下是一种可能的方法:

主窗口

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

public partial class MainWindow : Window
{
  ...
  MainWindow()
  {
       InitializeComponent();
       this.DataContext = new MainController();
  }
}
接下来的问题是如何让
DataGrid
根据需要处理
VarConfigList
,但这是另一回事


根据我有限的经验,整理数据上下文一直是学习WPF的最大障碍。

不要称之为控制器。我同意,克莱门斯,我更喜欢你的回答。我要把我的留给别人,因为有时候两种形式的词可以帮助别人理解。我认为,一旦你了解了DataContext,MVVM的使用就更清楚了(但这可能就是我自己),不要称它为控制器。我同意,克莱门斯,我更喜欢你的回答。我要把我的留给别人,因为有时候两种形式的词可以帮助别人理解。我想,一旦你了解了DataContext,MVVM的使用就更清楚了(但这可能就是我自己)。数据网格现在已填充。但优势是什么?如果列表更改,我需要重置datacontext吗?我真的不明白。如果存在私有集,我如何填充VarConfigList?如果列表发生更改,则不需要重置DataContext。当从列表中添加或删除元素时,ObservableCollection将通知这一点。如果要创建列表的新实例,ViewModel类还应实现INotifyPropertyChanged,并通知
VarConfigList
属性。在web上搜索
MVVM
。这是一种用于创建UI应用程序的架构模式,WPF完全支持它。如果有私有集,如何填充VarConfigList?
viewModel.VarConfigList.Add(新的VarConfig{…})。setter是私有的,这意味着您不能替换整个集合,但仍然可以访问现有集合。当然,这只是一个细节,二传者也可以公开。好的,谢谢。有没有办法通过网格更新集合?我就是这样做的。数据网格现在已填充。但优势是什么?如果列表更改,我需要重置datacontext吗?我真的不明白。如果存在私有集,我如何填充VarConfigList?如果列表发生更改,则不需要重置DataContext。当从列表中添加或删除元素时,ObservableCollection将通知这一点。如果要创建列表的新实例,ViewModel类还应实现INotifyPropertyChanged,并通知
VarConfigList
属性。在web上搜索
MVVM
。这是一种用于创建UI应用程序的架构模式,WPF完全支持它。如果有私有集,如何填充VarConfigList?
viewModel.VarConfigList.Add(新的VarConfig{…})。setter是私有的,这意味着您不能替换整个集合,但是
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
}
<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 
    }
}