Привязка данных с помощью DataGrid в WPF и MVVM - PullRequest
2 голосов
/ 15 февраля 2012

Я новичок в WPF, я использую шаблон MVVM в WPF и генерирую структуру Datatable во время выполнения, затем связываю Datatable с DataGrid / RadGridView, который работает, как и ожидалось.

Проблема: я хочу DataGrid/ RadGridView настраивается (где пользователь может добавить новую строку, удалить строку и редактировать данные) и при нажатии кнопки сохранить все должно быть сохранено в базе данных.У меня есть ситуация, когда мне нужно создать пустой DataTable с разными столбцами (в зависимости от ввода пользователя).Затем введите значения в эти столбцы, а затем нажмите «Сохранить», чтобы сохранить значение в базе данных.Я могу связать DataTable с DataGrid (я вижу все имена столбцов и строки данных, если в DataTable уже есть данные в сетке), но НЕ могу добавить (ввести) или удалить любую строку во время выполнения из DataGrid,Я установил «Истинное» значение для CanUserDeleteRows и CanUserInsertRows.Я не уверен, где я иду не так.Я реализую INotifyPropertyChanged в своем классе ViewModel.

Я пытаюсь получить желаемый результат.

Мой код выглядит следующим образом:

ViewModel -

    DataTable _manualDataTable;
    public DataTable ManualDataTable
    {
        get
        {
            return _manualDataTable;
        }
        set
        {
            _manualDataTable = value;
            OnPropertyChanged("ManualDataTable");
        }
    }

Для создания DataTable -

    void LoadManualDataTable()
    {
        DataTable dtData = new DataTable();
        dtData.Columns.Add("TimeStamp", typeof(DateTime));
        List<DataColumn> columns = new List<DataColumn>();
        var query = _dataContext.GetSenData().Where(sen => sen.LogID == ((DataLogs)SelectedItemNode).Logger.LogID).Select(sen => sen.SeriesID);
        var queryTS = _dataContext.GetDataSeries().Where(ts => query.Contains(ts.SeriesID));
        foreach (DataSeries ts in queryTS)
        {
            var queryPLoc = _dataContext.GetDataLoc().Where(pLoc => pLoc.ParamID == ts.ParamID).Select(pLoc => pLoc.Name);
            dtData.Columns.Add(queryPLoc.First(), typeof(string));
        }

        ManualDataTable = dtData;
     }

Код XAML -

     <DataGrid Grid.Row="0" AutoGenerateColumns="True" ItemsSource="{Binding ManualDataTable}" CanUserAddRows="True" CanUserDeleteRows="True" IsReadOnly="False"  Name="dataGridManualData"/>

DataTable создается должным образом (из метода LoadManualDataTable), и если я добавлю любую строку черезкод затем эти строки будут связаны и будут отображаться в DataGrid.Но я не могу создавать или удалять строки через DataGrid.

Любая помощь будет высоко оценена.

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 16 февраля 2012

Я создаю простой тестовый проект, чтобы получить то, что вы получаете, но он работает без каких-либо проблем. Может быть, вы должны опубликовать свой код и указать, что не работает.

public partial class MainWindow : Window
{
    public DataTable MyTable { get; set; }

    public MainWindow()
    {
        InitializeComponent();

        this.MyTable= new DataTable();
        this.MyTable.Columns.Add("Test");
        var row1 = this.MyTable.NewRow();
        row1["Test"] = "dsjfks";

        this.MyTable.Rows.Add(row1);

        this.DataContext = this;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("rows: " + this.MyTable.Rows.Count);
    }

}

XAML

<DockPanel>
    <Button Height="23" Content="sdf" Click="Button_Click" />
    <DataGrid ItemsSource="{Binding MyTable}" CanUserAddRows="True"/>
</DockPanel>
0 голосов
/ 23 апреля 2013

Я не уверен в своем ответе, но я собираюсь попробовать ...

У меня была та же проблема с тобой: CanUserAddRows всегда ложно.

Оказывается, с привязкой все в порядке, но у класса, которым я был, был конструктор по умолчанию.

это работает:

private ObservableCollection<Point> m_points;
public ObservableCollection<Point> Points
{
    get { return m_points; }
    set { m_points = value; }
}

public class Point
{
    public double X { get; set; }
    public double Y { get; set; }

    public Point()
    {
        this.X = 0;
        this.Y = 0;
    }

    public Point(double x, double y)
    {
        this.X = x;
        this.Y = y;
    }
}

это не работает:

private ObservableCollection<Point> m_points;
public ObservableCollection<Point> Points
{
    get { return m_points; }
    set { m_points = value; }
}

public class Point
{
    public double X { get; set; }
    public double Y { get; set; }

    public Point(double x, double y)
    {
        this.X = x;
        this.Y = y;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...