首页 文章

尝试在WPF中设置子DataGrid的itemsource时,获取类似“Items collection必须为空,然后才能使用ItemsSource . ”重复]

提问于
浏览
0

这个问题在这里已有答案:

我有一个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 回答

  • 2

    我想你可以尝试一下

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

    对于嵌套的DataGrid,将 DataGridTextColumn 放入 <DataGrid.Columns> 标记中

    <DataGrid ItemsSource="{Binding list}">
      <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Name}" />
      </DataGrid.Columns>
    </DataGrid>
    

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

    并且还修复了绑定,它们不需要使用父DataContext

相关问题