2017-07-16 10 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のコレクションにバインドされ、私は動的な列「姓」を表示し、また編集グリッド行

XAMLによって、新しい行を追加することができましたか?新しいアイテムがそこに表示されます。 Columnsコレクションには文字列インデクサも必要です。たとえば、 'dataGrid.Columns [" column name "]' – opewix

+0

@opewixはい、通常、各列はSourceコレクションのプロパティフォームにバインドされます。ここでは、すべての列が単一のプロパティにバインドされています。行内の各セルは辞書からの値であり、キーは列名です。編集を終了するときに値は常に空です。 – 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

私はテストプロジェクトを作成しました。

<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; } 
} 
関連する問題