Я создаю список контактов в WPF, используя MVVM. Когда пользователь добавляет контакт, представление NewContact будет в окне. Текстовые поля должны быть связаны с объектом с именем NewContact в NewContactViewModel. DataContext установлен в AppViewModel, который является моделью центрального представления, но в AppViewModel есть модель представления NewContact, называемая NewContactVM. Поскольку я подключаюсь непосредственно к этой виртуальной машине, я ожидаю, что она будет работать. Вот NewContact.xaml:
<Window x:Class="ContactList.Windows.NewContact"
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"
xmlns:local="clr-namespace:ContactList"
xmlns:vm="clr-namespace:ContactList.ViewModels"
xmlns:v="clr-namespace:ContactList.Views"
mc:Ignorable="d"
Title="NewContact" Height="450" Width="400">
<Window.DataContext>
<local:AppViewModel/>
</Window.DataContext>
<Grid>
<Border Padding="10">
<StackPanel>
<!-- Contact Entries-->
<!-- Contact Name -->
<TextBlock Text="Contact Name" Margin="5 10" />
<TextBox Text="{Binding NewContactVM.NewContact.Name,
FallbackValue=NULL, Mode=TwoWay}"
Padding="2" Margin="5 0" ></TextBox>
<!-- Contact Number -->
<TextBlock Text="Contact Number" Margin="5 10" />
<TextBox Text="{Binding NewContactVM.NewContact.PhoneNumber, FallbackValue=NULL, Mode=TwoWay}"
Padding="2" Margin="5 0"></TextBox>
<!-- Contact Email -->
<TextBlock Text="Contact Email" Margin="5 10" />
<TextBox Text="{Binding NewContactVM.NewContact.Email, FallbackValue=NULL, Mode=TwoWay}"
Padding="2" Margin="5 0"></TextBox>
<!-- Add Contact Button -->
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Button x:Name="AddContactButton" Grid.Column="1" Content="Add Contact"
Command="{Binding NewContactVM.SaveContactCommand}" Margin="10"/>
</Grid>
</StackPanel>
</Border>
</Grid>
</Window>
Однако всякий раз, когда добавляется NewContact, это всегда значение NULL. Это NewContactViewModel:
public class NewContactViewModel : ObservableObject
{
public ObservableCollection<Contact> Contacts { get; set; }
private List<Contact> _contacts;
private Contact _newContact;
public Contact NewContact
{
get { return _newContact; }
set { OnPropertyChanged(ref _newContact, value); }
}
public ICommand OpenNewContactWindowCommand { get; private set; }
public ICommand SaveContactCommand { get; private set; }
private IContactDataService _dataService;
public NewContactViewModel(IContactDataService dataService)
{
_dataService = dataService;
_contacts = dataService.GetContacts().ToList();
OpenNewContactWindowCommand = new RelayCommand(showNewContact);
SaveContactCommand = new RelayCommand(Save);
}
private void showNewContact()
{
NewContact newContact = new NewContact();
newContact.Show();
}
private void Save()
{
Contacts = new ObservableCollection<Contact>(_contacts);
_dataService.Save(_contacts);
Contacts.Add(NewContact);
_contacts.Add(NewContact);
}
}
Поскольку значение всегда равно null, привязка не должна происходить, но я не могу понять, почему, я новичок в архитектуре MVVM. (Для справки объект «Контакт» - это просто пользовательский объект с открытыми строками для имен с использованием методов получения и установки).