WPF DataGrid ContentControl绑定

时间:2014-12-26 07:13:43

标签: wpf datagrid

我想使用如下图所示的结构制作DataGrid。 enter image description here

每个单元格中有两个TextBox。

我做了Class

public class ComplexTable : ViewModelBase
    {
        public ComplexTable()
        {
            FirstProperty = new FirstClass();
            SecondProperty = new Second();    
        }
        public class FirstClass
        {
            public FirstClass()
            {
                First = "FirstString";
                Second = "SecondString";
            }
            public string First { get; set; }
            public string Second { get; set; }
        }

        public class Second
        {
            public Second()
            {
                Third = "ThirdString";
                Fourth = "FourthString";
            }
            public string Third { get; set; }
            public string Fourth { get; set; }
        }

        public FirstClass FirstProperty { get; set; }
        public Second SecondProperty { get; set; }
    }

    public ObservableCollection<ComplexTable> _testCollection = new ObservableCollection<ComplexTable>();
    private ObservableCollection<ComplexTable> TestCollection
    {
        get { return _testCollection; }
        set
        {
            _testCollection = value;
            RaisePropertyChanged("TestCollection");
        }

    }

一个TestCollection,它应该是DataGrid的ItemsSource。

我的DataGrid

<DataGrid  CanUserAddRows="True"
                       ItemsSource="{Binding TestCollection}">
                <DataGrid.Columns>
                    <DataGridTemplateColumn Header="First Column">
                        <DataGridTemplateColumn.CellEditingTemplate >
                            <DataTemplate >
                                <ContentControl>
                                    <StackPanel>
                                        <TextBox Text=" "/>
                                        <TextBox Text=" "/>
                                    </StackPanel>
                                </ContentControl>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellEditingTemplate>
                    </DataGridTemplateColumn>

                    <DataGridTemplateColumn Header="Second Column">
                        <DataGridTemplateColumn.CellEditingTemplate >
                            <DataTemplate >
                                <ContentControl>
                                    <StackPanel>
                                        <TextBox Text=" "/>
                                        <TextBox Text=" "/>
                                    </StackPanel>
                                </ContentControl>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellEditingTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>

我无法弄清楚如何绑定这些文本框。或者我走错了方向?

1 个答案:

答案 0 :(得分:0)

datagrid将列的DataContext设置为ItemSource的元素。 ItemSource中的每个元素都将显示为一行。在您的情况下,ItemSource是TestCollection。因此,DataGridTemplateColumn中的DataContext设置为TestCollection的元素。如果TestCollection包含ComplexTable元素。您可以直接绑定到ComplexTable上的属性。

var TestCollection = new ObservableCollection<DataForOneRow> {DataForFirstRow, DataForSecondRow, DataForThirdRow};

public class DataForOneRow {

    public string DataForFirstColumnFirstTextBox {get; set;} //left out raise of PropertyChanged for brevity
    public string DataForFirstColumnSecondTextBox {get; set;}

    public string DataForSecondColumnFirstTextBox {get; set;}
    public string DataForSecondColumnSecondTextBox {get; set;}
}

<DataGridTemplateColumn Header="First Column">
                    <DataGridTemplateColumn.CellEditingTemplate >
                        <DataTemplate >
                            <ContentControl>
                                <StackPanel>
                                    <TextBox Text="{Bidning DataForFirstColumnFirstTextBox}"/>
                                    <TextBox Text="{Bidning DataForFirstColumnSecondTextBox}"/>
                                </StackPanel>
                            </ContentControl>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellEditingTemplate>
                </DataGridTemplateColumn>

仅供参考:您必须在所有ViewModel属性中引发PropertyChanged事件。