Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF中的DataGrid数据绑定和MVVM_C#_Wpf_Mvvm_Data Binding_Observablecollection - Fatal编程技术网

C# WPF中的DataGrid数据绑定和MVVM

C# WPF中的DataGrid数据绑定和MVVM,c#,wpf,mvvm,data-binding,observablecollection,C#,Wpf,Mvvm,Data Binding,Observablecollection,一个WPF应用程序,它有一个窗口,其中包含一个数据网格,试图实现MVVM体系结构。只有一个模型类: public class Book { public int id {get; set;} public string title {get; set;} public string isbn {get; set;} } 这是ViewModel: class BookViewModel { public ObservableCollection<Book&g

一个WPF应用程序,它有一个
窗口
,其中包含一个
数据网格
,试图实现MVVM体系结构。只有一个模型类:

public class Book
{
    public int id {get; set;}
    public string title {get; set;}
    public string isbn {get; set;}
}
这是ViewModel:

class BookViewModel
{
    public ObservableCollection<Book> Books;

    public BookViewModel()
    {
        Books = new ObservableCollection<Book>();

        // TODO: execute LoadData comand
    }
}
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
    在启动时会被填充

除了初始化组件和设置数据上下文之外,窗口的代码隐藏中不应该有太多代码

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,可在此处找到此代码:。此外,通过RelayCommand实现,在线上还有许多其他有用的答案和资源。

第一步:您创建了一个窗口及其视图模型,并通过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>

第三步:修复绑定到工作的视图模型-绑定使用属性:

class BookViewModel
{
    public ObservableCollection<Book> Books { get; private set; }

    public BookViewModel()
    {
        Books = new ObservableCollection<Book>();
    }
}
类BookViewModel
{
公共可观测收集书籍{get;private set;}
PublicBookViewModel()
{
图书=新的可观察到的集合();
}
}

第四步:在视图模型中实现load data方法,并在
mainWin.Show()之后从命令调用它
加载初始数据

为什么要在
窗口中编写代码
代码隐藏而不是视图模型?@PavelAnikhouski正在学习一个教程。是什么让你认为这是MVVM…?最有用的答案。问题是,
可观察收集
不是一个属性。
<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>
class BookViewModel
{
    public ObservableCollection<Book> Books { get; private set; }

    public BookViewModel()
    {
        Books = new ObservableCollection<Book>();
    }
}