簡體   English   中英

當我按下 WPF Mvvm 中的按鈕時,如何在 DataGrid 中顯示數據?

[英]How can I show data in DataGrid when I press button in WPF Mvvm?

當我使用 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");
    }

}

主窗口.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>

中繼命令.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);
    }
}

我想在按下按鈕時使數據在數據網格中可見。 我該如何解決?

不知道你這里沒貼的代碼里有沒有做過,但是你好像沒有把MainWindow的DataContext設置成MyViewModel。

將其插入 MainWindow.xaml

<Window.DataContext>
    <local:MyViewModel/>
</Window.DataContext>

您需要執行以下操作。

  1. Students屬性中調用OnPropertyChanged
public ObservableCollection<Students> Students
{
    get { return _students; }
    set
    {
        if (_students == value) return;
        _students = value;
        OnPropertyChanged(nameof(Students));
    }
}
  1. 在 ViewModel 構造函數dataOnOff變量設置為true
public MyViewModel()
{
    dataOnOff = true;
    ReadCommand = new RelayCommand(DoRead);
}
  1. DoRead中調用FillList方法,如評論中所述:
public void DoRead(object param)
{
    FillList(param);
    dataOnOff = true;
    MessageBox.Show("s");
}
  1. 為您的 window 指定 ViewModel:
<Window.DataContext>
    <nameSpace:MyViewModel/>
</Window.DataContext>

更新

  1. 像這樣更改ItemsSource綁定語句(我將 (s)tudents 更改為 (S)tudents):
ItemsSource="{Binding Students, NotifyOnTargetUpdated=True,UpdateSourceTrigger=PropertyChanged}"

Output:

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM