【发布时间】:2022-04-29 04:07:56
【问题描述】:
我已经搜索了很多谷歌和 stackoverflow 来找到我的问题的答案,但没有任何运气。我找到了问题的解决方案。例如:
Data Binding to Nested Properties?
但我已经知道解决方案了。我想知道为什么 wpf 不支持控件上的嵌套/点数据绑定。
解决方案是将父控件的 DataContext 设置为父数据对象,在我的情况下,我的控制器/窗口数据上下文上的 ViewModel 属性。因此,我可以设置网格的 DataContext,如果我将 TextBox 绑定更改为仅使用 Name 属性,我的代码就可以工作。
另一种解决方案是在我的 TextBox 上显式设置 UpdateSourceTrigger 并将我的嵌套数据绑定保留在 TextBox 控件上,如下所示。
但是为什么呢?为什么在不显式设置 UpdateSourceTrigger 的情况下,WPF 不支持嵌套绑定,就像我在下面所做的那样?我想知道:)。
我有这个文本框控件:
<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>
我的窗口数据上下文是这样绑定的:
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));
}
}
}
带有文本框控件绑定的 Name 属性的我的 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));
}
}
【问题讨论】:
-
请看你提到的链接。
标签: c# .net wpf data-binding