簡體   English   中英

WPF 中的 DataGrid 數據綁定和 MVVM

[英]DataGrid data binding and MVVM in WPF

帶有包含DataGridWindow的 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.

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