Wpf 命令绑定在UI中引发异常

Wpf 命令绑定在UI中引发异常,wpf,c#-4.0,mvvm,wpf-controls,Wpf,C# 4.0,Mvvm,Wpf Controls,我试图通过制作一个魔卡应用程序来学习MVVM。从概念上讲,我不知道如何将数据和命令从视图模型链接到视图中。我了解如何使数据在视图模型中可用,但不了解如何从视图中访问数据 主要的问题是xaml中有什么不正确,我在按钮上得到一个异常,我假设与命令绑定有关,这也意味着数据可能也不工作 <Window x:Class="MagicDB.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

我试图通过制作一个魔卡应用程序来学习MVVM。从概念上讲,我不知道如何将数据和命令从视图模型链接到视图中。我了解如何使数据在视图模型中可用,但不了解如何从视图中访问数据

主要的问题是xaml中有什么不正确,我在按钮上得到一个异常,我假设与命令绑定有关,这也意味着数据可能也不工作

<Window x:Class="MagicDB.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:MagicDB"
    Title="MainWindow" Width="500" Height="500">

<Window.DataContext>
    <local:MainWindowViewModel x:Name="viewModel" />
</Window.DataContext>

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="50*" />
        <RowDefinition Height="450*" />
    </Grid.RowDefinitions>
    <DataGrid AutoGenerateColumns="False" 
        HorizontalAlignment="Left" 
        VerticalAlignment="Top"
        IsSynchronizedWithCurrentItem="True" Width="auto" Height="auto" Grid.Row="1">
        <DataGrid.Columns>
            <DataGridTextColumn Header="ID" Binding="{Binding CardID}" Width="25" ></DataGridTextColumn>
            <DataGridTextColumn Header="Name" Binding="{Binding Name}" Width="110"></DataGridTextColumn>
            <DataGridTextColumn Header="Mana" Binding="{Binding Mana}" Width="30" ></DataGridTextColumn>
            <DataGridTextColumn Header="Card Text" Binding="{Binding CardTXT}" Width="100*"></DataGridTextColumn>
            <DataGridTextColumn Header="Flavor Text" Binding="{Binding FlavorTXT}" Width="100*"></DataGridTextColumn>
            <!--DataGridCheckBoxColumn Header="Cost" Binding="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged}" ></DataGridCheckBoxColumn-->
        </DataGrid.Columns>
    </DataGrid>
    <Button Content="Initiliaze Database" Height="23" HorizontalAlignment="Left" Margin="55,16,0,0" Name="initdb" VerticalAlignment="Top" Width="75"
            Command="Binding InitCardDB"/>
</Grid>

主要问题是在按钮上引发异常。我认为我也没有得到网格的数据

namespace MagicDB
{
class MainWindowViewModel : ObservableObject
{
    private CardDB _cards;
    private Command _InitCardDB;

    public CardDB Cards
    {
        get { return _cards; }
        set { _cards = value; OnPropertyChanged("Cards"); }
    }

   public MainWindowViewModel()
    {
        //var cards = GetCards();

        //var cardViewModels = new List<CardViewModel>();
        //cards.ForEach(c => cardViewModels.Add(new CardViewModel(c)));
        _InitCardDB = new Command(InitDB, true);
        Cards = new CardDB(); ;
    }

    public Command InitCardDB
    {
        get
        {
            if (_InitCardDB == null)
            {
                _InitCardDB = new Command(
                    param => InitDB()
                );
            }
            return _InitCardDB;
        }

    }

    private void InitDB()
    {
        _cards = new CardDB();
        _cards.InitDB();
    }
}
cdb
{
类MainWindowViewModel:ObservableObject
{
私人信用卡;
私有命令_InitCardDB;
公共信用卡
{
获取{return\u cards;}
设置{u cards=value;OnPropertyChanged(“cards”);}
}
公共主窗口视图模型()
{
//var cards=GetCards();
//var cardViewModels=新列表();
//cards.ForEach(c=>cardwiewmodels.Add(新的cardwiewmodel(c));
_InitCardDB=新命令(InitDB,true);
Cards=新的CardDB();
}
公共命令InitCardDB
{
收到
{
如果(_InitCardDB==null)
{
_InitCardDB=新命令(
param=>InitDB()
);
}
返回_InitCardDB;
}
}
私有void InitDB()
{
_cards=新的CardDB();
_InitDB();
}
}
}


任何帮助都将是巨大的,特别是我做错了什么以及我在概念上犯了错误。我可能完全错误地处理了这个问题?提前感谢您的时间。

数据网格没有项目,因为您需要设置它的
项目资源

该按钮导致异常,因为您试图将字符串
“Binding InitCardDb”
分配给
命令
属性,而不是使用
“{Binding InitCardDb}”
“{}”
告诉XAML处理器使用所谓的标记扩展,而不是使用文本


除此之外,您的方法看起来是正确的

而且我的项目中唯一的名称空间是“MagicDB”,它用于我的所有文件。听起来您仍在研究什么是
DataContext
,以及绑定是如何工作的。你可能会对我最近写的一篇博客文章感兴趣,这篇文章用相当简单的术语解释了这些概念:谢谢,瑞秋,这正是我需要的汉克斯,我应该在哪里设置ItemsSource?“是的,ItemsSource=“{Binding Path=Cards}”我尝试了两种方法,但仍然没有得到要显示的数据。有趣的是,当我使用ItemsSource=“Cards”时,网格显示在设计器中,而当我使用ItemsSource={Binding Cards}时,它不工作,也不工作。但是按钮现在起作用了!它如何知道将CardID绑定到卡[I].cardd?这就是ItemsControl的魔力。它获取ItemsSource中的每个项目并以某种方式显示。DataGrid将每个项目转换为DataGridRow,ListBox将每个项目转换为ListBoxItem,ComboBox将每个项目转换为ComboBoxItem