Я искал google и stackoverflow, чтобы найти ответ на мой вопрос без везения. Я нахожу решение проблемы. Пример:WPF вложенные данные привязки к управлению - почему это не работает
Data Binding to Nested Properties?
Но я уже знаю решение. Я хочу знать, ПОЧЕМУ wpf не поддерживает вложенные/пунктирные привязки данных к элементам управления.
Решение состоит в том, чтобы установить DataContext родительского элемента управления в родительский объект данных в моем случае в качестве свойства ViewModel для моего контроллера/окна datacontext. Поэтому я могу установить DataContext моей сетки, и мой код будет работать, если я изменил привязку TextBox, чтобы использовать свойство Name.
Еще одно решение заключается в том, чтобы установить значение UpdateSourceTrigger в моем текстовом поле и сохранить привязку вложенных данных к элементу управления TextBox, как показано ниже.
Но почему? Почему WPF не поддерживает вложенную привязку, как я делаю ниже, без явного определения UpdateSourceTrigger? Я хотел бы знать это :).
У меня есть этот элемент управления текстового поля:
<Window>
<Grid>
<StackPanel>
<Label Content="Name" FontWeight="Bold"/>
<TextBox x:Name="NameTextBox" Text="{Binding Path=CreateEditAssetViewModel.Name, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" Width="475" Height="23" TextWrapping="Wrap" VerticalAlignment="Top" HorizontalContentAlignment="Stretch" Margin="0, 5" />
</StackPanel>
</Grid>
</Window>
Мое окно DataContext привязывается, как это:
var createEditWindow = new CreateEditWindow();
var createEditController = new CreateEditWindowController();
createEditWindow.DataContext = createEditController;
createEditWindow.Show();
Мой контроллер выглядит следующим образом:
public class CreateEditWindowController : ViewModelBase, ICreateEditWindowController
{
private ICreateEditWindowViewModel _createEditWindowViewModel;
public ICreateEditWindowViewModel CreateEditAssetViewModel
{
get { return _createEditWindowViewModel; }
set
{
if (_createEditWindowViewModel == value) return;
_createEditWindowViewModel = value;
OnPropertyChanged(nameof(CreateEditAssetViewModel));
}
}
}
Мой ViewModel с именем свойство, которое связывает элемент управления текстовым полем, выглядит следующим образом:
public class CreateEditWindowViewModel : ViewModelBase, ICreateEditWindowViewModel
{
private string _name;
public string Name
{
get { return _name; }
set
{
if (_name == value) return;
_name = value;
OnPropertyChanged(nameof(Name));
}
}
}
И мой ViewModelBase:
public class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
см. Ссылку, которую вы упомянули. –