-2

マジックカードアプリを作って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();
    }
}

}

特に私が間違っていることや、概念的に誤りを犯した場合は、どんな助けでも素晴らしいでしょう。私はこれに完全に間違ってアプローチしている可能性がありますか?よろしくお願いします。

4

1 に答える 1

0

DataGridを設定する必要があるため、アイテムはありませんItemsSource

を使用する代わりに文字列"Binding InitCardDb"Commandプロパティに割り当てようとしているため、ボタンが例外を引き起こしています。テキストを使用する代わりにマークアップ拡張機能と呼ばれるものを使用するようにXAMLプロセッサに指示します。"{Binding InitCardDb}""{}"

それ以外はあなたのアプローチは正しいように見えます

于 2012-09-25T18:58:46.373 に答える