![](/img/trans.png)
[英]How Can I update a row in WPF's datagrid when I 'm implementing MVVM ? ( without any Button)
[英]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>
您需要執行以下操作。
Students
屬性中調用OnPropertyChanged
:public ObservableCollection<Students> Students
{
get { return _students; }
set
{
if (_students == value) return;
_students = value;
OnPropertyChanged(nameof(Students));
}
}
dataOnOff
變量設置為true
:public MyViewModel()
{
dataOnOff = true;
ReadCommand = new RelayCommand(DoRead);
}
DoRead
中調用FillList
方法,如評論中所述:public void DoRead(object param)
{
FillList(param);
dataOnOff = true;
MessageBox.Show("s");
}
<Window.DataContext>
<nameSpace:MyViewModel/>
</Window.DataContext>
更新
ItemsSource
綁定語句(我將 (s)tudents 更改為 (S)tudents):ItemsSource="{Binding Students, NotifyOnTargetUpdated=True,UpdateSourceTrigger=PropertyChanged}"
Output:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.