在win 8商店应用中创建新对象

时间:2014-11-24 12:56:43

标签: c# xaml

我试图在我的win 8应用程序中实现一个简单的create-function。我试图使用MVVM模式。我试图用我的view.model将一个类传递到我的视图中,然后只需要几个文本框就可以创建一个新对象。这是ViewModel和类:

public class CreateViewModel : ViewModelBase
{
    public Place Place { get; set; }
}

public class Place
{
    [PrimaryKey, AutoIncrement]
    public int PlaceId { get; set; }

    public string Title { get; set; }

    public string Description { get; set; }
}

在MVC应用程序中,我会做一些@Html.TextBoxFor并创建一个post-method。 在XAML中,我不知道如何做到这一点。 视图模型将按原样传入视图。我可以像这样使用它的属性:

 <TextBox Grid.Row="0" Text="{Binding Path=Place.Title}"/>
 <TextBox Grid.Row="0" Text="{Binding Path=Place.Description}"/>

但是我不明白如何将新值“发布”回ViewModel并创建一个新对象?

编辑:

从我所看到的,这是一种在我的ViewModel中使用命令的方法:

public class CreateViewModel : ViewModelBase
    {
        public RelayCommand CreatePlaceCommand
        {
            get; 
            private set;
        }

        public Place Place { get; set; }

        public CreateViewModel()
        {
              InitializeCommands();
        }

        private void InitializeCommands()
        {
            CreatePlaceCommand =
                new RelayCommand(() =>
                {
                    //What goes here?
                });
        }
    }

我还将此代码添加到我的XAML:

 <TextBox Grid.Row="0" Text="{Binding Place.Title,Mode=TwoWay}"/>
    <TextBox Grid.Row="0" Text="{Binding Place.Description,Mode=TwoWay}"/>
    <Button Grid.Row="0" Content="Click"
             Command="{Binding CreatePlaceCommand}" >

    </Button>

我在这里走在正确的轨道上吗?它非常令人困惑=)

1 个答案:

答案 0 :(得分:2)

在这里,研究这个简单的例子来获取MVVM / DataBinding / Commands。它真的很简单但它应该显示&#34;模式&#34;使用。有足够的库(如MVVMLight)使命令等更简单,更强大。

假设我们有Place实体

public class Place
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public override string ToString()
    {
        return string.Format("Id={0},Title={1},Description={2}", 
            Id, Title, Description);
    }
}

您的应用程序中MainWindow.xaml名为wpfApplication1

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:wpfApplication1="clr-namespace:WpfApplication1"
        Title="MainWindow"
        Height="116"
        Width="250">

    <!-- set datacontext to mainviewmodel -->
    <Window.DataContext>
        <wpfApplication1:MainViewModel />
    </Window.DataContext>

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="30" />
        </Grid.RowDefinitions>

        <!-- input textboxes for title and description -->
        <StackPanel Grid.Row="0">
            <TextBox Text="{Binding Place.Title, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Height="25" />
            <TextBox Text="{Binding Place.Description, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Height="25" />
        </StackPanel>

        <!-- button bound to save command, declared in viewmodel -->
        <Button Grid.Row="1" Content="Save" Command="{Binding SaveCommand}" />
    </Grid>
</Window>

相关MainWindows.xaml.cs只包含InitializeComponents()

现在你的MainViewModel,&#34;照顾所有事情&#34;,看起来像

public class MainViewModel
{
    private Place _place;

    public MainViewModel()
    {
        // create and register new save command
        SaveCommand = new SaveCommand(this);
        CommandManager.RegisterClassCommandBinding(
            typeof(MainViewModel), new CommandBinding(SaveCommand));
    }

    // property to hold place data, exposed in UI
    public Place Place
    {
        get { return _place ?? (_place = new Place()); }
        set { _place = value; }
    }

    public ICommand SaveCommand { get; private set; }
}

viewmodel中使用的简单保存命令实现

public class SaveCommand : ICommand
{
    public event EventHandler CanExecuteChanged;
    private readonly MainViewModel _context;

    public SaveCommand(MainViewModel context)
    {
        _context = context;
    }

    public void Execute(object parameter)
    {
        Console.WriteLine(string.Format("Do something with {0}", _context.Place));
    }

    public bool CanExecute(object parameter)
    {
        return true;
    }
} 

现在,这将为您提供UI,如下所示(此示例不是Store应用程序的类型)

enter image description here

然后点击按钮就会吐出

Do something with Id=0,Title=Title,Description=and teh description