3

私は、ユーザーが会社の従業員の詳細をデータベースに入力できるようにするアプリケーションを開発しています。これまでのところ、私はWPFを試し、EntityFrameworkを使用しながらアプリケーション内にMVVMを実装しようとしています。

私はMaster-Detailアプリケーションを作成しており、MVVMを使用してこれを実現する方法を研究しています。これは、すべてに非常に慣れていないためです。

私が試した方法の1つは、View-Modelcalled内にプロパティを作成し、それをxaml内SelectedEmployeeのaにバインドすることです。List View

public Employee _SelectedEmployee;
public Employee SelectedEmployee
{
    get
    {
        return _SelectedEmployee;
    }
    set
    {
        if (_SelectedEmployee == value)
            return;

        _SelectedEmployee = value;
        OnPropertyChanged("SelectedEmployee");
    }
}
<ListView HorizontalAlignment="Left" Name="listview" VerticalAlignment="Bottom" ScrollViewer.HorizontalScrollBarVisibility="Visible"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding LoadEmployee}" SelectionMode="Single" SelectedItem="{Binding SelectedEmployee, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  Height="150" Grid.Row="1">

次に、ユーザーがSelectedItem内でを更新できるようにするメソッドがありますList View。しかし、ここで問題が発生します。からアイテムを選択するList Viewと、データベースの最初の行のみが更新され、選択したい行は更新されません。

これが方法です。

    public void UpdateEmployee(Employee emp)
    {
        using (DBEntities context = new DBEntities())
        {
                emp = context.Employees.Where(e => e.EmployeeID == SelectedEmployee.EmployeeID).FirstOrDefault();

                emp.Title = Title;
                emp.FirstName = FirstName;
                emp.Surname = Surname;
                emp.Position = Position;
                emp.DateOfBirth = DateOfBirth;
                emp.Address = Address;
                emp.Country = Country;
                emp.Postcode = Postcode;
                emp.PhoneNumber = PhoneNumber;
                emp.MobileNumber = MobileNumber;
                emp.FaxNumber = FaxNumber;
                emp.Email = Email;
                emp.NINumber = NINumber;
                emp.ChargableResource = ChargableResource;
                emp.ChargeOutRate = ChargeOutRate;
                emp.TimeSheetRequired = TimeSheetRequired;
                emp.WorkShift = WorkShift;
                emp.BenefitsProvided = BenefitsProvided;

                context.Employees.ApplyCurrentValues(emp);
                context.SaveChanges();
        }
    }

自分のプロパティを自分のxaml内にバインドしてview modelから、text-boxesを実装しOnPropertyChangedました。code-behindまた、コマンドを使用して、テスト容易性と保守性にとって重要な量を制限しています。

更新するコマンドメソッドは次のとおりです。

    private ICommand showUpdateCommand;
    public ICommand ShowUpdateCommand
    {
        get
        {
            if (showUpdateCommand == null)
            {
                showUpdateCommand = new RelayCommand(this.UpdateFormExecute, this.UpdateFormCanExecute);
            }
            return showUpdateCommand;
        }
    }

    private bool UpdateFormCanExecute()
    {
        return !string.IsNullOrEmpty(FirstName) ...
     }

    private void UpdateFormExecute()
    {
        UpdateOrganisationTypeDetail();
    }

私はMVVMを初めて使用するので、何が間違っているのかよくわかりません。入力していただければ幸いです:)。

4

1 に答える 1

0

次に、おそらく問題は更新にあります。リストビューで何をしようとしているのかよくわかりませんが、単純なデータグリッドでは機能しないため、これが役立つ場合があります。エラーが含まれていないエラーを見つけるために私が書いたものほどの答えではありません。何か問題があればコメントしてください。

public partial class MainWindow : Window
{
    private static MainViewModel _mainViewModel = new MainViewModel();
    public static ObservableCollection<Employee> staff = new ObservableCollection<Employee>();

    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = _mainViewModel;
        dataGrid1.DataContext = staff;
        listview.DataContext = staff;

        Employee Employee1 = new Employee();
        Employee1.name = "Jeff";
        staff.Add(Employee1);
        Employee Employee2 = new Employee();
        Employee2.name = "Jefferson";
        staff.Add(Employee2);
        Employee2.name = "Tim";

    }
}

public class Employee
{
    public string name { get; set; }
}

public class MainViewModel : INotifyPropertyChanged
{
    private string _SelectedEmployee;
    public string SelectedEmployee
    {
        get { return _SelectedEmployee; }
        set
        {
            _SelectedEmployee = value;
            NotifyPropertyChanged("SelectedEmployee");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
于 2012-12-17T11:37:14.527 に答える