を設定するとき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ではないことを意味します。
ありがとうございます! クリスは
_「MasterEmployeeのリファレンスを設定すると、ListBoxとのバインディングが失われるため」_ _ nope。コードビハインドで 'SelectedItem'を直接設定すると、バインディングは失われます。実際、 'MasterEmployee'プロパティを設定すると、選択した項目を変更するのに適切な方法です。あなたのコードには何か別の問題があります。しかし、問題を確実に再現する良い[mcve]がなければ、誰が何が間違っているのか正確に言うことはできないでしょう。 –
Model_EditEmployeeでは、ListOfEmployeesプロパティが新しいコレクションに設定されていることが奇妙に見えます。 ListOfEmployeesにその値が含まれていないため、MasterEmployeeプロパティが無効になることは明らかです。 – Clemens
私はこの声明に問題があると思う:_ "そして、別の従業員に行きたい" _。保存した後、別のアイテムをどのように選択しますか? –