2012-09-25 22 views
-2

我想通過製作魔術卡應用來學習MVVM。我從概念上不知道如何將數據和命令從視圖模型鏈接到View中。我瞭解如何在視圖模型中提供數據,但不知道如何從視圖中訪問數據。命令綁定在UI中引發異常

主要問題是什麼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(); 
    } 
} 

}

任何幫助將是巨大的,尤其是我在做什麼錯了,在我概念犯了一個錯誤。我可能會完全錯誤地處理這個問題?在此先感謝您的時間。

+0

此外,在我的項目中唯一的命名空間是「MagicDB」其他,它是用於我所有的文件。 – AnthonyFG

+0

聽起來好像你還在研究DataContext是什麼以及綁定是如何工作的。你可能會對我最近寫的博客文章感興趣,用相當簡單的術語來解釋這些概念:[你說的這個「DataContext」是什麼?](http://rachel53461.wordpress.com/2012/07/14/what-是這個datacontext你說的/) – Rachel

+0

謝謝,瑞秋,這正是我需要 – AnthonyFG

回答

0

DataGrid有沒有項目,因爲你需要設置其ItemsSource

的按鈕導致一個例外,因爲你正試圖指定字符串"Binding InitCardDb"Command屬性,而不是使用"{Binding InitCardDb}""{}"告訴XAML處理器用什麼叫做標記擴展,而不是使用文本

比你的做法看起來是正確的

+0

謝謝,我應該在哪裏設置ItemsSource? 「 AnthonyFG

+0

是的,ItemsSource =「{綁定路徑=卡}」 –

+0

ItemsSource = {綁定卡}「 – timmy