Как прочитать все значения текстового поля (сопоставить с полями базы данных) и сохранить их в базе данных в WPF - MVVM - PullRequest
2 голосов
/ 26 апреля 2011

Я новичок в WPF и MVVM. После долгого изобретения я узнал, как извлечь данные из базы данных и связать их с itemcontrol / listview / gridview.

Но у меня проблема не в том, как прочитать кучу значений текстового поля и сохранить как новую запись в базе данных.

Вот мой пример кода ..

View

<ItemsControl ItemsSource="{Binding AllEmployees}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBox Width="100" Text="{Binding FirstName}" Margin="4"/>
                        <TextBox Width="100" Text="{Binding LastName}" Margin="4"/>
                        <TextBox Width="100" Text="{Binding Age}" Margin="4"/>
                    </StackPanel>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
</ItemsControl>
<!-- For new Employee Details -->
<StackPanel>
        <TextBox x:Name="FirstName"/>
        <TextBox x:Name="LastName"/>
        <TextBox x:Name="Age"/>
        <Button Content="New" Command="{Binding NewEmployeeCommand}"/>
 </StackPanel>

Мой cs файл

    public ObservableCollection<DataAccess.Employee> AllEmployees
            {
                get;
                private set;
            }  

    public EmployeeListViewModel(EmployeeRepository employeeRepository)
            {
                if (employeeRepository == null)
                {
                    throw new ArgumentNullException("employeeRepository");
                }

                _employeeRepository = employeeRepository;
                this.AllEmployees = new ObservableCollection<DataAccess.Employee> 
                                    (_employeeRepository.ListAll());
 }  

Теперь, как я могу сохранить нового сотрудника Имя, Фамилия, Возраст в базе данных, прочитав эти текстовые поля ...

Как написать функцию для NewEmployeeCommand события для чтения текстовых полей ( отображение текстовых полей в соответствующие файлы данных в базе данных ) и сохранения данных в базе данных.

Большое спасибо!

Ответы [ 4 ]

2 голосов
/ 26 апреля 2011

если вы пытаетесь использовать MVVM, просто нужно:

  • Создайте вашу ViewModel, чтобы он содержал все свойства, необходимые вашему View *
  • Привязать к этим свойствам в Xaml

Например:

public class EmployeeListViewModel
{
  public ObservableCollection<Employee> AllEmployees {get;private set;}
  public string FirstName {get;set;}
  public string LastName {get;set;}
  public int? Age {get;set;}  
  public ICommand NewEmployeeCommand {get;set;}

  //You need to connect to this method by using a Delegate/RelayCommand see link below
  public void AddNewEmployee()
  {
    //Add your real code here to actually insert into the db
    var result = InsertEmployeeIntoDatabase(FirstName,LastName,Age);
    //You probably want to add this new employee to the list now ;)
    AllEmployees.Add(result);
    //Now you probably want to reset your fields
    FirstName = null;
    LastName = null;
    Age = null;
  }
}

Нажмите здесь для реализации команды делегата

А затем просто отредактируйте свой xaml следующим образом:

<ItemsControl ItemsSource="{Binding AllEmployees}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBox Width="100" Text="{Binding FirstName}" Margin="4"/>
                        <TextBox Width="100" Text="{Binding LastName}" Margin="4"/>
                        <TextBox Width="100" Text="{Binding Age}" Margin="4"/>
                    </StackPanel>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
</ItemsControl>
<!-- For new Employee Details -->
<StackPanel>
        <TextBox Text={Binding FirstName}"/>
        <TextBox Text={Binding LastName}"/>
        <TextBox Text={Binding Age}"/>
        <Button Content="New" Command="{Binding NewEmployeeCommand}"/>
</StackPanel>
1 голос
/ 26 апреля 2011

вы не читаете значения Textbox.вам нужен NewEmployeeViewModel и привязать TextBox к свойствам.

EDIT:

, просто создайте класс с INotifyPropertyChanged и нужными вам свойствами.

public class NewEmployee : INotifyPropertyChanged 
{
   public string FirstName
   {
     get{return this._firstname;}
     set{this._firstname = value;
         OnPropertyChanged("FirstName");}
   }
   //... other properties
 }

xaml

<StackPanel DataContext={Binding MyNewEmployeeProperty}>
    <TextBox x:Name="FirstName" Text={Binding FirstName}/>
    <TextBox x:Name="LastName" Text={Binding LastName}/>
    <TextBox x:Name="Age" Text={Binding Age}/>
    <Button Content="New" Command="{Binding NewEmployeeCommand}"/>
</StackPanel>
1 голос
/ 26 апреля 2011

Вы можете передать ссылки в параметре команды:

<StackPanel>
    <TextBox x:Name="FirstName"/>
    <TextBox x:Name="LastName"/>
    <Button Content="New" Command="{Binding NewEmployeeCommand}">
        <Button.CommandParameter>
            <x:Array Type="{x:Type TextBox}">
                <x:Reference Name="FirstName"/>
                <x:Reference Name="LastName"/>
            </x:Array>
        </Button.CommandParameter>
    </Button>
</StackPanel>

В зависимости от того, какое событие вы используете, вы выбираете параметр и получаете значения:

TextBox[] textBoxes = e.Parameter as TextBox[]; //RoutedEvent
TextBox[] textBoxes = parameter as TextBox[]; //If the executed handler provides the parameter

string firstName = textBoxes[0].Text;
string lastName = textBoxes[1].Text;
//create entry; store in DB

Через переплет:

<Button.CommandParameter>
    <local:MyEntry FirstName="{Binding ElementName=FirstName, Path=Text}"
                   LastName="{Binding ElementName=LastName, Path=Text}"/>
</Button.CommandParameter>
MyEntry entry = parameter as MyEntry;
//store in DB
0 голосов
/ 29 апреля 2011

Правильный ответ.

Моя новая заявка в xmal должна быть

<StackPanel>
        <TextBox Text={Binding Employee.FirstName}"/>
        <TextBox Text={Binding Employee.LastName}"/>
        <TextBox Text={Binding Employee.Age}"/>
        <Button Content="New" Command="{Binding NewEmployeeCommand}"/>
</StackPanel>

Мой cs файл

public class EmployeeListViewModel : INotifyPropertyChanged 
{
  Employee _employee;
  RelayCommand _addNewEmployee;
  EmployeeRepository _employeeRepository;

  public Employee Employee
  {
       get
       {
         return _employee;
       }
       set
       {
          _employee = value;
          OnPropertyChanged("Employee");
        }

  }    

  public void NewEmployeeCommand()
  {
    if(_addNewEmployee == null)
    {
       _addNewEmployee = new RelayCommand( param => NewEmployeeCommandExecute(), 
                                           param => NewEmployeeCommandCanExecute
                                          );
    }
  }

  void NewEmployeeCommandExecute()
  {
         _employeeRepository.Add(Employee); 
         _employeeRepository.Save();
   }

   bool NewEmployeeCommandCanExecute
   {
         get
         {
            return true;
         }
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...