Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用动态创建的“DataGrid”列-WPF启用“CanUserAddRows”_C#_Wpf_Xaml_Datagrid - Fatal编程技术网

C# 使用动态创建的“DataGrid”列-WPF启用“CanUserAddRows”

C# 使用动态创建的“DataGrid”列-WPF启用“CanUserAddRows”,c#,wpf,xaml,datagrid,C#,Wpf,Xaml,Datagrid,DataGrid列是在代码隐藏中动态创建的。为了动态绑定列,我有一个Dictionary属性,该属性以键作为列标题和值 列被绑定到字典,如下所示: var item = new DataGridTextColumn(); item.Width = new DataGridLength(1, DataGridLengthUnitType.Auto); item.Header = name; item.Binding = new Binding($"di[{name}].obj") { Mode =

DataGrid
列是在代码隐藏中动态创建的。为了动态绑定列,我有一个
Dictionary
属性,该属性以键作为列标题和值

列被绑定到字典,如下所示:

var item = new DataGridTextColumn();
item.Width = new DataGridLength(1, DataGridLengthUnitType.Auto);
item.Header = name;
item.Binding = new Binding($"di[{name}].obj") { Mode = BindingMode.TwoWay };

它工作得很好,但我不知道如何从新的行表单
DataGrid

中获取值。不久前,我遇到了类似的问题。下面你可以找到我的解决方案。基本上,我需要更改AddingNewRow事件。您将需要更改类型等,以满足您的需要,但这应该是相当容易的

private void AddingNewRow(object sender, AddingNewItemEventArgs e)
{
    DictionaryRowData newRow = new DictionaryRowData();
    for (int i = 0; i < dictionaryData.Columns.Count; i++)
    {
        newRow.Cells.Add(new DictionaryCellData());
    }

    e.NewItem = newRow;
}
private void AddingNewRow(对象发送方,AddingNewItemEventArgs e)
{
DictionaryRowData newRow=新DictionaryRowData();
对于(int i=0;i

对不起,没有完全符合你的情况,但我现在没有时间。我希望这会有所帮助

我已经创建了一个测试项目,ExpandoObject为我工作。我可以显示动态列“FirstName”,还可以通过编辑网格行添加新行

XAML:


政务司司长:

公共部分类主窗口:窗口
{
公共视图模型Vm{get;set;}
公共主窗口()
{
初始化组件();
}
私有无效网格加载1(对象发送方,路由目标)
{
Vm=新的ViewModel();
Vm.Items=新的ObservableCollection();
DataContext=Vm;
var fieldName=“FirstName”;
var item=new ExpandoObject()作为IDictionary;
item.Add(fieldName,“Adam”);//动态添加新字段
变量eoItem=作为ExpandooObject的项;
Vm.Items.Add(eoItem);
//动态添加新列
var col=新的DataGridTextColumn();
col.Width=新的DataGridLength(1,DataGridLengthUnitType.Auto);
列标题=字段名;
col.Binding=newbinding(fieldName){Mode=BindingMode.TwoWay};
MyGrid.Columns.Add(col);
}
私有无效按钮\u单击(对象发送者,路由目标e)
{
}
}
公共类视图模型
{
公共ObservableCollection项{get;set;}
}

您的DataGrid是否绑定到集合?新项目应该出现在那里。在Columns集合中还应该有一个字符串索引器。例如
dataGrid.Columns[“column name”]
@opewix Yes,通常每个列都绑定到源集合中的一个属性,在我的例子中,所有列都绑定到一个属性。这是字典,行中的每个单元格都是字典中的一个值,其中键是列名。当结束编辑时,值总是空的。我使用
List
进行动态绑定。如果没有,考虑使用它answers@opewix我会尝试一下,谢谢:)@opewix我确实将代码更改为使用
ExpandoObject
,同样的问题,它都可以正常工作,但是添加到
列表中的项目不包含输入的值。你知道怎么解决这个问题吗?
<Grid Margin="0,0,0,56" Loaded="Grid_Loaded_1">
    <DataGrid Name="MyGrid" ItemsSource="{Binding Items}" HorizontalAlignment="Left" Margin="69,33,0,0" VerticalAlignment="Top" Height="220" Width="389"/>
    <Button Content="Button" HorizontalAlignment="Left" Height="22" Margin="339,286,0,-45" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
</Grid>
public partial class MainWindow : Window
{
    public ViewModel Vm { get; set; }

    public MainWindow()
    {
        InitializeComponent();
    }

    private void Grid_Loaded_1(object sender, RoutedEventArgs e)
    {
        Vm = new ViewModel();
        Vm.Items = new ObservableCollection<ExpandoObject>();
        DataContext = Vm;

        var fieldName = "FirstName";
        var item = new ExpandoObject() as IDictionary<string, Object>;
        item.Add(fieldName, "Adam"); // Dynamically adding new fields

        var eoItem = item as ExpandoObject;
        Vm.Items.Add(eoItem);

        // Dynamically adding new columns
        var col = new DataGridTextColumn();
        col.Width = new DataGridLength(1, DataGridLengthUnitType.Auto);
        col.Header = fieldName;
        col.Binding = new Binding(fieldName) { Mode = BindingMode.TwoWay };
        MyGrid.Columns.Add(col);
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {

    }
}

public class ViewModel
{
    public ObservableCollection<ExpandoObject> Items { get; set; }
}