Как привязать DataGrid к базе данных из базы данных, используя MVVM в wpf? - PullRequest
0 голосов
/ 16 января 2019

Моя модель, модель представления и XAML выглядит следующим образом:

Это мой ViewModelClass:

class AllResultsViewModel
{

    private ICommand _clickCommand;
    public ICommand ClickCommand
    {
        get
        {
            return _clickCommand ?? (_clickCommand = new CommandHandler(param => this.MyAction(_cvm),
                param => this._canExecute));
        }
    }
    private bool _canExecute;
    private ComboBoxViewModel _cvm;
    public DataTable AllResults { get; set; }
    public AllResultsViewModel(ComboBoxViewModel CVM)
    {
        _canExecute = true;
        _cvm = CVM;
    }

    public void MyAction(ComboBoxViewModel cvm)
    {
       //Connecting to DB to retrieve data in datatable
    }
}
public class CommandHandler : ICommand
{
    private Action<object> _execute;
    // private bool _canExecute;
    private Predicate<object> _canExecute;

    #region Constructors

    /// <summary>
    /// Creates a new command that can always execute.
    /// </summary>
    /// <param name="execute">The execution logic.</param>
    public CommandHandler(Action<object> execute)
    : this(execute, null)
    {
    }

    /// <summary>
    /// Creates a new command.
    /// </summary>
    /// <param name="execute">The execution logic.</param>
    /// <param name="canExecute">The execution status logic.</param>
    public CommandHandler(Action<object> execute, Predicate<object> canExecute)
    {
        if (execute == null)
            throw new ArgumentNullException("execute");

        _execute = execute;
        _canExecute = canExecute;
    }

    #endregion // Constructors

    [DebuggerStepThrough]
    public bool CanExecute(object parameters)
    {
        //  return _canExecute;
        return _canExecute == null ? true : _canExecute(parameters);
    }

    //  public event EventHandler CanExecuteChanged;

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public void Execute(object parameters)
    {
        _execute(parameters);
    }

}

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

                <DataGrid Name="results_grid" IsReadOnly="True" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" Margin="10" ItemsSource="{Binding AllResults}" DisplayMemberPath="AllResultsGrid" ColumnWidth="100" RowHeight="30">

Класс моей модели:

открытый класс AllResultsModel { private DataTable _allresultsgrid;

    public DataTable AllResultsGrid
    {
        get { return _allresultsgrid; }
        set { _allresultsgrid = value; }
    }

}

Я что-то здесь упускаю? Код успешно создается, а данные извлекаются из БД. Но я не могу просмотреть его в датагриде.

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Ваш код очень запутан, и я думаю, что вам нужно хорошо изучить, как использовать MVVM: https://www.tutorialspoint.com/mvvm/ (скачать PDF).

В вашем Model.cs вам нужно определить только те классы, которые определяют ваши объекты, как показано ниже:

public class MyData
{
  public int Par1{ get; set; }
  public string Par2 { get; set; }
  public string Par3 { get; set; }
}

Затем вам нужно создать наблюдаемую коллекцию в вашей ViewModel, реализующую NotifiyPropertyChanged:

public class ViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    private ObservableCollection<MyData> myData = ObservableCollection<MyData>;
    public ObservableCollection<MyData>  MyData
    {
        get { return myData; }
        set { myData = value; NotifyPropertyChanged("MyData"); }
    }
}

Затем в ViewModel вы выполните функцию MyAction () следующим образом:

public void MyAction(ComboBoxViewModel cvm)
{
   //Connecting to DB to retrieve data in datatable
   MyData = new ObservableCollection<MyData>(dataFromDB);
}

Наконец, вы просто связываете MyData в ItemsSource в xaml.

Не забудьте назначить свою модель просмотра как страницу / текст данных windows!

0 голосов
/ 16 января 2019

Похоже, вы пропустили вызов propertychan (). Я почти уверен, что таблица данных не запускает события изменения свойств. Попытайтесь вызвать propertyloaded для свойства «AllResults», как только вы закончили загружать в него данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...