c# - 当我在 WPF Mvvm 中按下按钮时,如何在 DataGrid 中显示数据?

标签 c# wpf mvvm datagrid

当我使用 MVVM 按下按钮时,我想让数据出现在数据网格上。
当你直接从构造函数调用一个方法时,数据会出现,但是当你按下按钮时,数据不会出现。

这是我的代码

MyViewModel.cs

public class MyViewModel : INotifyPropertyChanged
{

    static string strConn = "";
    MySqlConnection con;
    MySqlCommand cmd;
    MySqlDataAdapter adapter;
    DataSet ds;
    Boolean dataOnOff = false;
    public ObservableCollection<Students> _students = new ObservableCollection<Students>();
    public ObservableCollection<Students> Students
    {
        get { return _students; }
        set
        {
            if (_students == value) return;
            _students = value;
        }
    }

    public MyViewModel()
    {



        ReadCommand = new RelayCommand(DoRead);
    }


    public void FillList(object param)
    {
        if (dataOnOff == true)
        {
            try
            {

                con = new MySqlConnection(strConn);
                con.Open();
                cmd = new MySqlCommand("select * from student", con);
                adapter = new MySqlDataAdapter(cmd);
                ds = new DataSet();
                adapter.Fill(ds, "student");

                if (_students == null)
                    _students = new ObservableCollection<Students>();

                foreach (DataRow dr in ds.Tables[0].Rows)
                {
                    _students.Add(new Students
                    {
                        grade = Convert.ToInt32(dr[0].ToString()),
                        cclass = Convert.ToInt32(dr[1].ToString()),
                        name = Convert.ToString(dr[2].ToString()),
                        no = Convert.ToInt32(dr[3].ToString()),
                        score = Convert.ToString(dr[4].ToString())
                    });
                }

            }
            catch (Exception ex)
            {

            }

            finally
            {
                ds = null;
                adapter.Dispose();
                con.Close();
                con.Dispose();
            }
            dataOnOff = false;
        }
    }



    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }


    public RelayCommand ReadCommand { get; set; }
    public RelayCommand SaveCommand { get; set; }
    public RelayCommand AddUserCommand { get; set; }
    public RelayCommand DeleteUserCommand { get; set; }


    public void DoRead(object param)
    {
        FillList(param);
        dataOnOff = true;
        MessageBox.Show("s");
    }

}

MainWindow.xaml
<DockPanel LastChildFill="False">
        <Border DockPanel.Dock="Left" Width="610"  Padding="10">
            <DataGrid Width="590" Height="400" HorizontalAlignment="Left" Name="studentDataGrid" ColumnWidth="*" AutoGenerateColumns="False"
                      Grid.Row="1" ItemsSource="{Binding students, NotifyOnTargetUpdated=True,UpdateSourceTrigger=PropertyChanged}">

                <DataGrid.Columns>
                    <DataGridTextColumn Header="grade" Binding="{Binding grade,NotifyOnTargetUpdated=True, UpdateSourceTrigger=PropertyChanged}"/>
                    <DataGridTextColumn Header="class" Binding="{Binding cclass, NotifyOnTargetUpdated=True,UpdateSourceTrigger=PropertyChanged}" Foreground="Black"/>
                    <DataGridTextColumn Header="name" Binding="{Binding name, NotifyOnTargetUpdated=True, UpdateSourceTrigger=PropertyChanged}"/>
                    <DataGridTextColumn Header="no" Binding="{Binding no, NotifyOnTargetUpdated=True, UpdateSourceTrigger=PropertyChanged}"/>
                    <DataGridTextColumn Header="score" Binding="{Binding score, NotifyOnTargetUpdated=True, UpdateSourceTrigger=PropertyChanged}"/>

                </DataGrid.Columns>
            </DataGrid>
        </Border>
        <Border DockPanel.Dock="Right" Width="180"  Padding="0">
            <Grid >
                <Grid.RowDefinitions>
                    <RowDefinition Height="25*"/>
                    <RowDefinition Height="25*"/>
                    <RowDefinition Height="25*"/>
                    <RowDefinition Height="25*"/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="15*"/>
                    <ColumnDefinition Width="35*"/>
                    <ColumnDefinition Width="15*"/>
                </Grid.ColumnDefinitions>
            <Button x:Name="ReadBtn" Content="READ" VerticalAlignment="Center" Height="25" Margin="10,15,10,15"  Grid.Row="0" Grid.Column="1" Command="{Binding ReadCommand}"/>
                <Button x:Name="InsertBtn" Content="INSERT" VerticalAlignment="Center" Height="25" Margin="10"  Grid.Row="1" Grid.Column="1" />
                <Button x:Name="UpdateBtn" Content="UPDATE" VerticalAlignment="Center" Height="25" Margin="10"  Grid.Row="2" Grid.Column="1" />
                <Button x:Name="DeleteBtn" Content="DELETE" VerticalAlignment="Center" Height="25" Margin="10"  Grid.Row="3" Grid.Column="1"/>
            </Grid>
        </Border>


    </DockPanel>

RelayCommand.cs
 public class RelayCommand : ICommand
{
    readonly Action<object> _execute;
    readonly Predicate<object> _canExecute;

    public RelayCommand(Action<object> execute) : this(execute, null)
    {

    }

    public RelayCommand(Action<object> execute, Predicate<object> canExecute)
    {
        if (execute == null)
            throw new ArgumentNullException("execute");

        _execute = execute;
        _canExecute = canExecute;
    }

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

    public bool CanExecute(object parameter)
    {
        return _canExecute == null ? true : _canExecute(parameter);
    }

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

我想在按下按钮时使数据在数据网格中可见。
我该如何解决? 😭

最佳答案

您需要执行以下操作。

  • 调用 OnPropertyChangedStudents楼盘:
  • public ObservableCollection<Students> Students
    {
        get { return _students; }
        set
        {
            if (_students == value) return;
            _students = value;
            OnPropertyChanged(nameof(Students));
        }
    }
    
  • 设置 dataOnOff可变为 true在 ViewModel 构造函数中:

  • public MyViewModel()
    {
        dataOnOff = true;
        ReadCommand = new RelayCommand(DoRead);
    }
    
  • 调用 FillList DoRead 中的方法,如评论中所述:
  • public void DoRead(object param)
    {
        FillList(param);
        dataOnOff = true;
        MessageBox.Show("s");
    }
    
  • 为您的窗口指定 ViewModel:

  • <Window.DataContext>
        <nameSpace:MyViewModel/>
    </Window.DataContext>
    

    更新
  • 更改ItemsSource像这样的绑定(bind)声明(我将 (s)tudents 更改为 (S)tudents):

  • ItemsSource="{Binding Students, NotifyOnTargetUpdated=True,UpdateSourceTrigger=PropertyChanged}"
    

    输出:

    enter image description here

    关于c# - 当我在 WPF Mvvm 中按下按钮时,如何在 DataGrid 中显示数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58181420/

    相关文章:

    c# - MVC和MVVM框架的ViewModel部分位于哪一层?

    c# - 为什么属性目标 'typevar' 未记录?

    wpf - 双击Tab Control中的TabItem,View会弹出 float 窗口

    c# - 无法在 DataGrid 中拖动自定义 ScrollBar Thumb(但 RepeatButtons 可以正常工作)?

    html - Kendo Ui控件的MVVM验证

    c# - Xamarin Forms - 否定 bool 绑定(bind)值

    c# - 如何让 MySQL 与 ASP.NET MVC 5 中的登录管理器配合使用?

    c# - 如何使用 MassTransit.Multibus 配置 IRequestClient<T> 和 IConsumer<T>?

    c# - 统一构建&运行项目后出现蓝屏

    c# - 如何自动创建 WPF Viewmodel 属性