На этот вопрос очень широкие ответы. Для своих приложений могут использовать разные люди с разными подходами.
Но мы всегда следуем одной общей формуле. Каждое представление - будет иметь свою модель представления. (Опять же, при таком подходе кто-то может сказать, что это может быть неправдой все время).
Из вашего кода (xaml и код) ниже мои наблюдения.
<Window.DataContext>
<vm:MainVM x:Name="MainVM"/>
</Window.DataContext>
-
Мне вообще не нравится устанавливать контекст данных в xaml. Вместо этого я предпочитаю устанавливать его в коде программной части (в основном из конструктора)
Вместо того, чтобы создавать свойства зависимости в пользовательском элементе управления и связывать свойства MainVM со свойствами зависимости пользовательского элемента управления.
Я предпочитаю делать это так.
Я предпочитаю создать отдельный UserControlViewModel.cs и добавить к нему необходимые свойства.
public class UserControlViewModel : INotifyPropertyChanged
{
private string nameInput;
public string NameInput {
get { return nameInput; }
set
{
nameInput = value;
OnPropertyChanged(nameof(NameInput));
}
}
private string surnameInput;
public string SurnameInput {
get { return surnameInput; }
set {
surnameInput = value;
OnPropertyChanged(nameof(SurnameInput));
}
}
private string fullName;
public string FullName {
get { return fullName; }
set {
fullName = value;
OnPropertyChanged(nameof(FullName));
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
Тогда я предпочитаю добавить это как свойство в MainVM.cs
public class MainVM : INotifyPropertyChanged
{
private UserControlViewModel _userControlViewModel;
public UserControlViewModel UserControlViewModel
{
get { return _userControlViewModel; }
set
{
_userControlViewModel = value;
OnPropertyChanged(nameof(UserControlViewModel));
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
// Rest of your code
// You don't need existing properties any more here.
// If you want to access these properties from MainVM then use the UserControlViewModel property and access the members of it.
}
Затем я предпочитаю установить контекст данных моего UserControl для этого свойства как показано ниже в моем MainWindow.xaml
<uc:NameConcatControl x:Name="NameUC" ="{Binding UserControlViewModel}" />
Моя привязка usercontrol contorl по-прежнему остается такой же, как и имена свойств, и мы перешли на UserControlViewModel.cs
Теперь вы может удалить все свойства зависимостей из кода, стоящего за UserControl.xaml.cs
Примечание: - Как я сказал в начале своего ответа, этот вопрос имеет широкую область для ответов, и их много возможно Возможности ответить на этот вопрос.
Надеюсь, я попытался дать вам некоторые комментарии со своей стороны. Думаю, это должно дать вам представление о том, как развиваться дальше.
Вы можете попробовать внести эти изменения и сообщить мне, если у вас возникнут какие-либо ошибки или проблемы с привязкой.