2017-07-16 34 views
1

DataGrid列是在代碼後面動態創建的。爲了動態綁定列,我有一個Dictionary<string, obj>屬性,其中鍵爲列標題和值。啓用具有動態創建的「DataGrid」列的`CanUserAddRows` - WPF

和列被綁定到字典是這樣的:

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

+0

是您的DataGrid中綁定到一個集合?新項目應該出現在那裏。 Columns集合中也應該有一個字符串索引器。例如'dataGrid.Columns [「列名稱」]' – opewix

+0

@opewix是的,通常每列都綁定到源集合的屬性,在我的情況下,所有列都綁定到一個屬性。這是字典,行內的每個單元格都是來自字典的值,其中鍵是列名。並且在結束編輯時值總是空的。 – IBRA

+0

前段時間我不得不在Silverlight中使用動態列。我使用'List '來進行動態綁定。考慮使用它,如果沒有答案 – opewix

回答

0

我得到的值類似的問題在前一段時間。下面你可以找到我的解決方案。基本上我需要改變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; 
} 

對不起,因爲沒有完全匹配你的情況,但我現在沒有時間了。我希望它會幫助

1

我已經創建了一個測試項目和ExpandoObject爲我工作。我能夠顯示動態欄「姓」,並通過編輯網格行

XAML添加新行:

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

CS:

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; } 
}