我有一个绑定到DataTable的WPF DataGrid。我不喜欢这样做,但数据来自分隔文本文件,我不知道表中包含多少个字段(列)。以编程方式,这似乎是实现此目的的最简单方法(使用MVVM和避免代码背后),但鉴于我想要双向绑定,也许这不会工作。绑定到WPF DataGrid的DataTable不更新
数据网格定义像这样的观点:
<DataGrid x:Name="dataGrid" ItemsSource="{Binding FileTable, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
HorizontalAlignment="Stretch" Margin="0,60,0,0" VerticalAlignment="Stretch">
</DataGrid>
的视图模型通过读取文本文件建立的数据表,并将两个布尔值到每一行的末尾。我想要布尔值映射到DataGrid中的复选框,但它们不这样做,并且在更改值时,我没有在视图模型中获取任何事件。我想我需要更换数据表,如其他相关问题所见,但它们都是响应改变视图的视图模型(如添加一列的按钮),而不是从数据网格视图。
对于上下文这里是的FileTable成员在我的视图模型:
private DataTable _fileTable;
public DataTable FileTable
{
get
{
return _fileTable;
}
set
{
if (value != _fileTable)
{
_fileTable = value;
NotifyPropertyChanged("FileTable");
}
}
}
这里是从文本文件创建数据表的代码:
public DataTable ParseFileToTable(Document doc, string PlaceHolders)
{
if (dt == null)
{
dt = new DataTable();
}
else dt.Clear();
if (filepath == null)
{
OpenFileDialog dlg = new OpenFileDialog();
dlg.DefaultExt = ".txt"; // Default file extension
dlg.Filter = "Text documents (.txt)|*.txt"; // Filter files by extension
Nullable<bool> result = dlg.ShowDialog();
if (result != true) return null;
filepath = dlg.FileName;
StreamReader r = new StreamReader(filepath);
string line = r.ReadLine(); // First Line is Column Names
string[] h_line = line.Split('\t'); // tab delimeter is hardcoded for now
for(int i = 0; i < h_line.Count(); i++)
{
dt.Columns.Add(h_line[i]);
}
dt.Columns.Add(new DataColumn("Exists", typeof(bool)));
dt.Columns.Add(new DataColumn("Placeholder", typeof(bool)));
//read the rest of the file
while (!r.EndOfStream)
{
line = r.ReadLine();
string [] a_line = line.Split('\t');
DataRow nRow = dt.NewRow();
for(int i = 0; i < h_line.Count(); i++)
{
nRow[h_line[i]] = a_line[i];
}
nRow["Exists"] = DoesSheetExist(doc, h_line[0], a_line[0]);
nRow["Placeholder"] = IsAPlaceholder(a_line[0], PlaceHolders);
dt.Rows.Add(nRow);
}
}
return dt;
}
你似乎有一堆XAML丢失 - 你没有显示你的列。 – slugster
我没有定义列,因为我不知道有多少....这就是为什么我绑定到数据表。这是xaml的程度。它的工作原理除了双向绑定不能返回到数据表。 –