2017-08-01 10 views
0

を設定するときListBox.SelectedItem私はデータバインディングといくつかの問題を抱えているキャンセルバインディング...ここの状況です:SelectedIndexを

私のビュー:

<Window x:Class="Shifter.Forms.Employee.frmEditEmployee" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     mc:Ignorable="d" 
     Title="frmEditEmployee" Height="350.141" Width="497.195" WindowStyle="None" ResizeMode="NoResize" Foreground="Blue" WindowStartupLocation="CenterScreen">   

    <Grid>  
     <ListBox x:Name="lstEmployee" IsEnabled="{Binding NoEditMode}" SelectedItem="{Binding MasterEmployee}" ItemsSource="{Binding Path=ListOfEmployees}" HorizontalAlignment="Left" Height="276" Margin="25,19,0,0" VerticalAlignment="Top" Width="217" /> 
     <TextBox x:Name="txtForename" Text="{Binding SelectedItem.Forname, ElementName=lstEmployee}" Margin="342,21,0,0" GotFocus="SelectText"/> 
     <TextBox x:Name="txtLastname" Text="{Binding SelectedItem.Lastname, ElementName=lstEmployee}" Margin="342,47,0,0" GotFocus="SelectText"/> 
     <TextBox x:Name="txtShowingname" Text="{Binding SelectedItem.Showingname, ElementName=lstEmployee}" Margin="342,74,0,0" GotFocus="SelectText"/> 
     <TextBox x:Name="txtPersonelNumber" Text="{Binding SelectedItem.EmployeeID, ElementName=lstEmployee}" Margin="342,99,0,0" GotFocus="SelectText"/> 
     <DatePicker x:Name="dtpBirthday" SelectedDate="{Binding SelectedItem.Birthday, ElementName=lstEmployee}" HorizontalAlignment="Left" Margin="342,125,0,0" VerticalAlignment="Top" RenderTransformOrigin="0.256,0.417" SelectedDateFormat="Short"/> 
     <TextBox x:Name="txtLoan" Text="{Binding SelectedItem.Loan, ElementName=lstEmployee}" Margin="342,151,0,0" TextWrapping="Wrap" GotFocus="SelectText"/> 
     <TextBox x:Name="txtPhone" Text="{Binding SelectedItem.Telephone, ElementName=lstEmployee}" Margin="342,229,0,0" TextWrapping="Wrap" GotFocus="SelectText"/> 
     <TextBox x:Name="txtEMail" Text="{Binding SelectedItem.EMail, ElementName=lstEmployee}" Margin="342,255,0,0" TextWrapping="Wrap" GotFocus="SelectText"/> 
     <ComboBox x:Name="cmbContract" ItemsSource="{Binding ListOfContracts, Mode=TwoWay}" SelectedItem="{Binding SelectedItem.Contract, ElementName=lstEmployee, Mode=TwoWay}" HorizontalAlignment="Left" Margin="342,179,0,0" VerticalAlignment="Top" Width="130"/> 
     <ComboBox x:Name="cmbGroup" ItemsSource="{Binding ListOfGroups, Mode=TwoWay}" SelectedItem="{Binding SelectedItem.Group, ElementName=lstEmployee, Mode=TwoWay}" HorizontalAlignment="Left" Margin="342,204,0,0" VerticalAlignment="Top" Width="130"/> 
     <CheckBox x:Name="chkHide" Content="MA im Dienstplan ausblenden" IsChecked="{Binding SelectedItem.isHiding, ElementName=lstEmployee}" HorizontalAlignment="Left" Margin="259,280,0,0" VerticalAlignment="Top" ToolTip="Der Mitarbeiter wird nicht im Dienstplan angezeigt (beispielsweise wegen längerer Abwesenheit)" Width="211"/>    

     <Button x:Name="btnAdd" Content="Add" Command="{Binding Path=cmdAdd, Mode=TwoWay}" HorizontalAlignment="Left" Height="35" Margin="25,303,0,0" VerticalAlignment="Top" Width="35"> 
     </Button> 
     <Button x:Name="btnEdit" Content="Edit" Command="{Binding Path=cmdEdit}" HorizontalAlignment="Left" Height="35" Margin="70,303,0,0" VerticalAlignment="Top" Width="35"> 
     </Button> 
     <Button x:Name="btnDelete" Content="Delete" Command="{Binding Path=cmdDelete}" HorizontalAlignment="Left" Height="35" Margin="115,303,0,0" VerticalAlignment="Top" Width="35"> 
     </Button> 
     <Button x:Name="btnCancel" Content="Cancel" Command="{Binding Path=cmdCancel}" HorizontalAlignment="Left" Height="35" Margin="391,303,0,0" VerticalAlignment="Top" Width="35"> 
     </Button> 
     <Button x:Name="btnOK" Content="OK" Command="{Binding Path=cmdOK}" HorizontalAlignment="Left" Height="35" Margin="436,303,0,0" VerticalAlignment="Top" Width="35"> 
     </Button> 
    </Grid> 
</Window> 

私のViewModel:

namespace Models 
{ 
    public class VM_EditEmployee : INotifyPropertyChanged 
    { 
     #region Propertys 
     private ObservableCollection<Common.Employee> mListOfEmployees; 
     private ObservableCollection<Common.EmployeeContract> mListOfContracts; 
     private ObservableCollection<Common.EmployeeGroup> mListOfGroups; 
     private Common.Employee mMasterEmployee; 
     private bool isNew; 
     private Employee.frmEditEmployee EmpoyeeView; 

     public event PropertyChangedEventHandler PropertyChanged; 

     public ObservableCollection<Common.Employee> ListOfEmployees 
     { 
      get 
      { 
       return mListOfEmployees; 
      } 

      set 
      { 
       mListOfEmployees = value; 
       OnPropertyChanged("ListOfEmployees"); 
      } 
     } 
     public ObservableCollection<EmployeeContract> ListOfContracts 
     { 
      get 
      { 
       return mListOfContracts; 
      } 

      set 
      { 
       mListOfContracts = value; 
       OnPropertyChanged("ListOfContracts"); 
      } 
     } 
     public ObservableCollection<EmployeeGroup> ListOfGroups 
     { 
      get 
      { 
       return mListOfGroups; 
      } 

      set 
      { 
       mListOfGroups = value; 
       OnPropertyChanged("ListOfGroups"); 
      } 
     } 
     public Common.Employee MasterEmployee 
     { 
      get 
      { 
       return mMasterEmployee; 
      } 

      set 
      { 
       mMasterEmployee = value; 
       OnPropertyChanged("MasterEmployee"); 
      } 
     } 


     public ICommand cmdAdd { get; set; } 
     public ICommand cmdEdit { get; set; } 
     public ICommand cmdDelete { get; set; } 
     public ICommand cmdCancel { get; set; } 
     public ICommand cmdOK { get; set; } 

     #endregion 

     public VM_EditEmployee(Employee.frmEditEmployee tmpView) 
     { 
      EmpoyeeView = tmpView; 
      cmdAdd = new RelayCommand(o => AddEntry()); 
      cmdEdit = new RelayCommand(o => EditEntry()); 
      cmdDelete = new RelayCommand(o => DeleteEntry()); 
      cmdCancel = new RelayCommand(o => Cancel()); 
      cmdOK = new RelayCommand(o => SaveEntry()); 

      ListOfEmployees = Database_Employee.GetListOfEmployee(); 
      ListOfContracts = Database_Contract.GetListOfContract(); 
      ListOfGroups = Database_Group.GetListOfGroups(); 
     } 

     protected internal void OnPropertyChanged(string propertyname) 
     { 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyname)); 
     } 

     private void DeleteEntry() 
     { 
      if (MessageBox.Show("Sure you want to delete?", "Question", MessageBoxButton.OKCancel) == MessageBoxResult.OK) 
      { 
       Database_Employee.DeleteEmployee(MasterEmployee); 
       ListOfEmployees = Database_Employee.GetListOfEmployee(); 
      } 
     } 

     private void Cancel() 
     { 

     } 

     private void AddEntry() 
     { 
      isNew = true; 
      Common.Employee newEmployee = new Common.Employee() 
      { 
       Forname = "Max", 
       Lastname = "Mustermann", 
       Showingname = "Max", 
       EmployeeID = 666, 
       Birthday = new System.DateTime(1980, 5, 5), 
       Loan = "9,50", 
       Contract = Database_Contract.GetListOfContract()[0], 
       Group = Database_Group.GetListOfGroups()[0], 
       Telephone = "012456789", 
       EMail = "[email protected]", 
       isHiding = false 
      }; 

      ListOfEmployees.Add(newEmployee); 
      MasterEmployee = newEmployee; 
     } 

     private void EditEntry() 
     { 
      isNew = false; 
     } 

     private void SaveEntry() 
     { 
       if (isNew == true) 
       { 
        Database_Employee.CreateEmployee(MasterEmployee);      
       } 
       else     { 
        Database_Employee.EditEmployee(MasterEmployee); 
       } 
       ListOfEmployees = Database_Employee.GetListOfEmployee(); 
      } 
      else // Wenn der EditMode nict aktiv ist 
      { 
       EmpoyeeView.Close(); 
      } 


     } 
    } 
} 

「MasterEmployee」プロパティは、ViewModelで選択した項目にアクセスして従業員の変更を保存するためのプロパティです。 すべて正常に動作し、ListBoxはデータで満たされ、リストボックス内の選択した従業員の詳細がテキストボックスに正しく表示されます(これ以上のものがありますが、この質問には必要ありません)。

私は新しい従業員を作成するときにクラスemployeeの新しいインスタンスを作成し、それにいくつかのプレースホルダ情報を入力し、この新しい従業員にMasterEmployeeの参照を設定します。これは、ビューの次に、私は新しい従業員を編集し、変更を保存し、ListViewの別の従業員に行きたいと何も起こりません。 MasterEmployeeのリファレンスを設定すると、ListBoxとのバインディングが失われるためです。

私の質問は:どのようにこの問題を解決できますか?私は、MVVMのパターン、つまり、コードを介してバインディングを設定するために、私はviewmodelのビューにアクセスする必要があり、それはMVVMではないことを意味します。

ありがとうございます! クリスは

+1

_「MasterEmployeeのリファレンスを設定すると、ListBoxとのバインディングが失われるため」_ _ nope。コードビハインドで 'SelectedItem'を直接設定すると、バインディングは失われます。実際、 'MasterEmployee'プロパティを設定すると、選択した項目を変更するのに適切な方法です。あなたのコードには何か別の問題があります。しかし、問題を確実に再現する良い[mcve]がなければ、誰が何が間違っているのか正確に言うことはできないでしょう。 –

+0

Model_EditEmployeeでは、ListOfEmployeesプロパティが新しいコレクションに設定されていることが奇妙に見えます。 ListOfEmployeesにその値が含まれていないため、MasterEmployeeプロパティが無効になることは明らかです。 – Clemens

+0

私はこの声明に問題があると思う:_ "そして、別の従業員に行きたい" _。保存した後、別のアイテムをどのように選択しますか? –

答えて

1

私は、それが不完全である可能性があるため、投稿のコードでいくつかの問題を参照してください。

  • SelectedItemを:あなたはなどのテキストボックスのSelectedItemに結合されているのだが、あなたのVMにそのようなプロパティがありません。おそらく、​​にバインドすることを意味します。 (注:代わりにそのSelectedItemに名前を付けることにします)。私はこれがあなたが見ているものの根本的な原因だと思う。
  • SaveEntryを実行すると、リストが完全に再作成されている可能性があります。したがって、​​はそのリストにもう存在しません。私はこれがさらなるバグにつながるかもしれないと思う。リストにないノードが表示されています。

投稿したコードが不完全でコンパイルされないため、これは役立ちません。問題の絞り込みを試みてください。

-1

問題が解決しました。これは、従業員クラスの問題で、GetHashCode関数をオーバーライドしてemployeeIDを返しました。これにより、employeeIDを編集するときにバインディングが上がります...あなたの努力に感謝します!

関連する問題