Wpf 将DataGrid列绑定到另一个对象内的集合
我有一个名为TestData的对象,它包含两个属性,一个字符串和一个ObservableCollection。我有一个ObservableCollection,用于在代码中的DataGrid中生成列。基于TestData对象动态生成DataGridTextColumn及其各自的标题没有问题,但是我无法将DataGridTextColumn绑定属性绑定到TestData内部的ObservableCollection 现在,我已经用文字说明了问题,让我通过张贴代码来澄清它: TestData.csWpf 将DataGrid列绑定到另一个对象内的集合,wpf,data-binding,datagrid,Wpf,Data Binding,Datagrid,我有一个名为TestData的对象,它包含两个属性,一个字符串和一个ObservableCollection。我有一个ObservableCollection,用于在代码中的DataGrid中生成列。基于TestData对象动态生成DataGridTextColumn及其各自的标题没有问题,但是我无法将DataGridTextColumn绑定属性绑定到TestData内部的ObservableCollection 现在,我已经用文字说明了问题,让我通过张贴代码来澄清它: TestData.cs
public class TestData
{
private ObservableCollection<string> data = new ObservableCollection<string>();
public string Header { get; set; }
public ObservableCollection<string> Data
{
get
{
return data;
}
set
{
data = value;
}
}
}
公共类TestData
{
私有ObservableCollection数据=新ObservableCollection();
公共字符串头{get;set;}
公共可观测收集数据
{
得到
{
返回数据;
}
设置
{
数据=价值;
}
}
}
MainWindow.xaml.cs代码隐藏
public partial class MainWindow : Window
{
private ViewModel viewModel = new ViewModel();
private List<string> headers = new List<string>();
private ObservableCollection<TestData> mainData = new ObservableCollection<TestData>();
public MainWindow(ViewModel vm)
{
InitializeComponent();
viewModel = vm;
this.DataContext = viewModel;
mainData = viewModel.MainData;
this.spreadSheet.ItemsSource = viewModel.MainData;
foreach (TestData data in mainData)
{
if (headers.Contains(data.Header) == false)
{
headers.Add(data.Header);
DataGridTextColumn col = new DataGridTextColumn();
int x = viewModel.MainData.IndexOf(data);
Binding bind = new Binding("Data");
bind.BindsDirectlyToSource = true;
bind.Source = mainData[x];
col.Binding = bind;
col.Header = data.Header;
this.spreadSheet.Columns.Add(col);
}
}
}
}
公共部分类主窗口:窗口
{
private ViewModel ViewModel=new ViewModel();
私有列表头=新列表();
私有ObservableCollection mainData=新ObservableCollection();
公共主窗口(ViewModel vm)
{
初始化组件();
viewModel=vm;
this.DataContext=viewModel;
mainData=viewModel.mainData;
this.spreadSheet.ItemsSource=viewModel.MainData;
foreach(mainData中的TestData数据)
{
if(headers.Contains(data.Header)==false)
{
headers.Add(data.Header);
DataGridTextColumn col=新DataGridTextColumn();
int x=viewModel.MainData.IndexOf(数据);
绑定=新绑定(“数据”);
bind.BindsDirectlyToSource=true;
bind.Source=mainData[x];
col.Binding=绑定;
列标题=数据标题;
这个.spreadSheet.Columns.Add(col);
}
}
}
}
XAML MainWindow.XAML
<Grid>
<DataGrid AutoGenerateColumns="False" Height="Auto" HorizontalAlignment="Stretch" Name="spreadSheet" VerticalAlignment="Stretch" Width="Auto" />
</Grid>
如果我在ObservaleCollection中放置4个TestData对象,我可以很好地获得它们的标题,但是TestData对象中ObservaleCollection中的所有数据在DataGrid中都显示为(Collection)
提前谢谢 我认为你没有正确地看待这个问题。
您不能将一个单独的集合和一个字符串绑定到每一列。
将单个二维行和列集合作为一个整体绑定到DataGrid 请注意,列没有ItemsSource属性。只有路径属性。 DataGrid具有ItemsSource属性
公共类Myrow
{
公共字符串Col1{get;private set;}
公共字符串Col2{get;private set;}
公共Myrow(字符串col1,字符串col2){col1=col1,col2=col2}
}
可观察收集Myrows。。。
MyRows绑定到DataGrid(而不是列)问题是,我不知道要显示多少列数据,也不知道要显示多少行数据。您可以将集合绑定到特定列,如这里的XAML所示,但我需要动态绑定到驻留在对象内部的集合。错误。“获取或设置将列与数据源中的属性关联的绑定”。我知道怎么解决这个问题。你从我的答案上贴了一个链接,完全错误地引用了。在我指出没有ItemsSource属性之后。你是独立的。他们不是在使用DatGridTextColumn中的Binding属性(在我们都指出的示例中,LOL)绑定到列表吗?但在该链接中没有说“将集合绑定到特定列”,这是你自己编的。“将列与属性关联”的哪一部分不清楚?我明白你的意思。也许我应该考虑扩展DataGridTextColumn并添加对绑定到集合的支持。
public class Myrow
{
public string Col1 { get; private set; }
public string Col2 { get; private set; }
public Myrow (string col1, string col2) { Col1 = col1, Col2 = Col2 }
}
ObservableCollection<Myrow> Myrows ...