我有一个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吗?
答案 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; }
}
}