获取类似“例如,在使用ItemsSource之前,项集合必须为空”。同时尝试在WPF中设置子DataGrid的itemsource

时间:2017-12-07 07:20:53

标签: wpf mvvm data-binding datagrid

我有一个Datagrid和另一个嵌套在父DataGrid中的DataGrid。我需要将子DataGrid的ItemSource设置为父DataContext的属性。我已经尝试使用RelativeSource作为子itemsource来获取父datacontext。

xaml代码

<DataGrid Grid.Row ="1" x:Name="Grid1" ItemsSource="{Binding Path=md,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" AutoGenerateColumns="False">
    <DataGrid.Columns>
      <DataGridTextColumn Header="Categogy" Width="100"  Binding="{Binding Path =CateName,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
      <DataGridTemplateColumn Header="Characterictics" Width="300">
           <DataGridTemplateColumn.CellTemplate>
             <DataTemplate>
               <DataGrid ItemsSource="{Binding DataContext.list, RelativeSource={RelativeSource AncestorType=DataGrid}}">
                 <DataGridTextColumn Binding="{Binding DataContext.list.Name, RelativeSource={RelativeSource AncestorType=DataGrid}}" />
               </DataGrid>
             </DataTemplate>
           </DataGridTemplateColumn.CellTemplate>
      </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

视图模型

Model m = new Model();
m.CateName = "CategoryName";
m.list.Add(new Characteristics() { Name="XX", Value="00"});
m.list.Add(new Characteristics() { Name = "XX", Value = "00" });
m.list.Add(new Characteristics() { Name = "XX", Value = "00" });
md.Add(m);

Model m1 = new Model();
m1.CateName = "CategoryName1";
m1.list.Add(new Characteristics() { Name = "XX", Value = "00" });
m1.list.Add(new Characteristics() { Name = "XX", Value = "00" });
m1.list.Add(new Characteristics() { Name = "XX", Value = "00" });
md.Add(m1);

list = new ObservableCollection<Characteristics>();
list.Add(new Characteristics() { Name = "XX", Value = "00" });
list.Add(new Characteristics() { Name = "XX", Value = "00" });

Characteristics类具有Name和Model属性。

现在,我遇到了异常,例如“在使用ItemsSource之前,项目集合必须为空。”

我不确定我在哪里做错了? 有人可以帮我正确绑定子dataGrid Itemsource吗?

2 个答案:

答案 0 :(得分:2)

将嵌套的DataGrid位置gc放入 <%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %> <cc1:FilteredTextBoxExtender ID="FilteredTextBoxExtender_txtName" runat="server" Enabled="True" FilterType="LowercaseLetters,UppercaseLetters,Custom" FilterMode="InvalidChars" InvalidChars="1234567890<>'" TargetControlID="txtName"> </cc1:FilteredTextBoxExtender> 标记

DataGridTextColumn

否则DataGridTextColumn被解释为Item并导致itemsSource

错误

并修复绑定,他们不需要使用父DataContext

答案 1 :(得分:0)

我想你可以试试这个

 <DataGrid Grid.Row ="1" x:Name="Grid1" ItemsSource="{Binding Path=md,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Categogy" Width="100"  Binding="{Binding Path =CateName,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                <DataGridTemplateColumn Header="Characterictics" Width="600">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <DataGrid   AutoGenerateColumns="False" Height="100" ItemsSource="{Binding list}">
                                <DataGrid.Columns>
                                    <DataGridTextColumn Header="Name" Binding="{Binding Name}" />
                                </DataGrid.Columns>
                            </DataGrid>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>

编辑:如果您更喜欢使用窗口的datacontext中的列表 请将嵌套的datarid更改为

 <DataGrid   AutoGenerateColumns="False" Height="100" ItemsSource="{Binding list,RelativeSource={RelativeSource AncestorType=Window}}">
                                <DataGrid.Columns>
                                    <DataGridTextColumn Header="Name" Binding="{Binding Name}" />
                                </DataGrid.Columns>
                            </DataGrid>

视图模型:

  public partial class MainWindow : Window
    {
        private ObservableCollection<Model> _md = new ObservableCollection<Model>();
        public ObservableCollection<Model> md
        {
            get { return _md; }
            set { _md = value; }
        }

        private ObservableCollection<Characteristics> _list;
        public ObservableCollection<Characteristics> list
        {
            get { return _list; }
            set { _list = value; }
        }
        public MainWindow()
        {
            InitializeComponent();

            this.DataContext = this;

            Model m = new Model();
            m.CateName = "CategoryName";
            m.list.Add(new Characteristics() { Name = "test Name", Value = "00" });
            m.list.Add(new Characteristics() { Name = "TEst name1", Value = "00" });
            m.list.Add(new Characteristics() { Name = "XX", Value = "00" });
            md.Add(m);

            Model m1 = new Model();
            m1.CateName = "CategoryName1";
            m1.list.Add(new Characteristics() { Name = "XX", Value = "00" });
            m1.list.Add(new Characteristics() { Name = "XX", Value = "00" });
            m1.list.Add(new Characteristics() { Name = "XX", Value = "00" });
            md.Add(m1);

            list = new ObservableCollection<Characteristics>();
            list.Add(new Characteristics() { Name = "vali", Value = "00" });
            list.Add(new Characteristics() { Name = "XX", Value = "00" });

        }      
    }

    public class Model
    {
        private string cateName;
        public string CateName
        {
            get { return cateName; }
            set { cateName = value; }
        }

        private List<Characteristics> _list = new List<Characteristics>();

        public List<Characteristics> list
        {
            get { return _list; }
            set { _list = value; }
        }
    }

    public class Characteristics
    {
        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        private string value;

        public string Value
        {
            get { return this.value; }
            set { this.value = value; }
        }
    }