У меня есть DataGrid WPF, который я привязываю к DataTable. Мне не нравится это делать, но данные поступают из текстового файла с разделителями, и я не знаю, сколько полей (столбцов) будет содержать эта таблица. Программно это, по-видимому, самый простой способ выполнить это (используя MVVM и избегая кода позади), но учитывая, что я хочу двухстороннюю привязку, возможно, это не сработает.DataTable привязан к WPF DataGrid не обновляется
DataGrid определяется как это в представлении:
<DataGrid x:Name="dataGrid" ItemsSource="{Binding FileTable, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
HorizontalAlignment="Stretch" Margin="0,60,0,0" VerticalAlignment="Stretch">
</DataGrid>
ViewModel устанавливает DataTable путем чтения текстового файла, и добавляет два логических значения в конце каждой строки. Я хочу, чтобы логические значения отображались в флажках в DataGrid, но они этого не делают, и я не получаю никаких событий в модели viewmodel при изменении значений. Я думаю, что мне нужно изменить данные, как видно из других связанных вопросов, но все они реагируют на viewmodel, изменяя представление (например, кнопку, которая добавляет столбец), вместо того, чтобы иметь изменения из набора данных в пределах Посмотреть.
Для контекста здесь является членом FileTable в моем ViewModel:
private DataTable _fileTable;
public DataTable FileTable
{
get
{
return _fileTable;
}
set
{
if (value != _fileTable)
{
_fileTable = value;
NotifyPropertyChanged("FileTable");
}
}
}
А вот код, который создает DataTable из текстового файла:
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. Он работает, за исключением того, что двусторонняя привязка не возвращается к данным. –