[英]DataGrid data binding and MVVM in WPF
帶有包含DataGrid
的Window
的 WPF 應用程序,試圖實現 MVVM 架構。 有單Model class:
public class Book
{
public int id {get; set;}
public string title {get; set;}
public string isbn {get; set;}
}
這是視圖模型:
class BookViewModel
{
public ObservableCollection<Book> Books;
public BookViewModel()
{
Books = new ObservableCollection<Book>();
// TODO: execute LoadData comand
}
}
用於視圖標記的 XAML 代碼的部分片段,由單個 Window 組成:
<Window.CommandBindings>
<CommandBinding Command="self:CustomCommands.LoadData" CanExecute="LoadDataCommand_CanExecute" Executed="LoadDataCommand_Executed"/>
</Window.CommandBindings>
<DataGrid Name="BooksDataGrid>
<DataGrid.Columns>
<DataGridTextColumn Header="Title" Width="200" Binding="{Binding title}"/>
<DataGridTextColumn Header="isbn" Width="200" Binding="{Binding isbn}"/>
</DataGrid.Columns>
</DataGrid>
上面視圖背后的代碼:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
// TODO: execute LoadData command
}
private void LoadDataCommand_CanExecute(object sender, CanExecuteRoutedEventArgs args)
{
args.CanExecute = true;
}
private void LoadDataCommand_Executed(object sender, ExecutedRoutedEventArgs args)
{
// TODO: ask the model for the data
}
}
public static class CustomCommands
{
public static readonly RoutedUICommand LoadData = new RoutedUICommand
(
"LoadData",
"LoadData",
typeof(CustomCommands),
new InputGestureCollection()
{
// allow Ctrl+L to perform this command
new KeyGesture(Key.L, ModifierKeys.Control)
}
);
}
App.xaml 的代碼隱藏:
public partial class App : Application
{
[STAThread()]
public static void Main()
{
App app = new App();
app.InitializeComponent();
app.Run();
}
// bind application and show main window on startup
// data context is default source of bindings
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
View.MainWindow mainWin = new View.MainWindow();
ViewModel.BookViewModel bookViewModel = new ViewModel.BookViewModel();
mainWin.DataContext = bookViewModel;
mainWin.Show();
}
}
我正在從 WinForms 過渡到 WPF,發現 WPF 的某些方面令人困惑。 試圖實現的目標和面臨的問題如下:
LoadData
命令應該清理GridView
,然后從數據庫中再次填充它。 數據庫連接已經實現。 到目前為止,我看不到如何讓數據綁定工作。LoadData
命令應該從菜單和按鈕(已經實現)中執行。LoadData
命令應在應用程序啟動時執行。 這樣DataGrid
將在啟動時被填充。第一步:您創建了一個 window,它的視圖 model 並通過 DataContext 連接它們。 已經完成了
View.MainWindow mainWin = new View.MainWindow();
ViewModel.BookViewModel bookViewModel = new ViewModel.BookViewModel();
mainWin.DataContext = bookViewModel;
第二步:修復(添加)xaml 中的綁定:
<DataGrid Name="BooksDataGrid" ItemsSource="{Binding Books}">
<DataGrid.Columns>
<DataGridTextColumn Header="Title" Width="200" Binding="{Binding title}"/>
<DataGridTextColumn Header="isbn" Width="200" Binding="{Binding isbn}"/>
</DataGrid.Columns>
</DataGrid>
第三步:修復視圖 model 以使綁定工作 - 綁定與屬性一起工作:
class BookViewModel
{
public ObservableCollection<Book> Books { get; private set; }
public BookViewModel()
{
Books = new ObservableCollection<Book>();
}
}
第四步:在視圖model中實現加載數據方法,並從命令中調用,在mainWin.Show();
加載初始數據
除了初始化組件和設置數據上下文之外,window 的代碼隱藏中不應該有太多代碼。
public MainWindow()
{
IntializeComponent();
DataContext = new BookViewModel();
}
並且您的 loadData 命令將在 BookViewModel 中實現
private bool _canLoadDataExecute;
private ICommand _loadDataCommand;
public Icommand LoadDataCommand => _loadDataCommand ?? _loadDataCommand = new RelayCommand((obj) => LoadDataCommand = LoadData(), canLoadDataExecute);
public void LoadData()
{
}
為了使上面的代碼正常工作,您還需要實現 RelayCommand.cs,可以在此處找到相關代碼: Relay Command 的完整實現 - 它可以應用於所有情況嗎? . 此外,還有許多其他有用的答案和資源在線 RelayCommand 實施。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.