如何在Grid级别局部调整DataContext?实现P1属性简化绑定
解决方案:给Grid绑定特定DataContext简化子控件绑定
当然可以实现你想要的效果!不过你之前写的<Grid DataContext="P1">存在一个小问题——这里是把字符串"P1"直接赋值给了Grid的DataContext,而不是绑定到ViewModel里的P1属性。只要调整一下绑定语法,就能完美达成你的需求:
正确的实现方式
把Grid的DataContext改成使用{Binding P1}的绑定表达式,这样Grid的DataContext就会指向Window的ViewModel中对应的Person实例,子控件就可以直接绑定该实例的属性了:
<Grid DataContext="{Binding P1}"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <TextBox Grid.Row="0" Text="{Binding Name}"/> <TextBox Grid.Row="1" Text="{Binding Age}"/> </Grid>
绑定不同Person对象的扩展
如果需要让其他Grid绑定ViewModel里的P2、P3等Person属性,只需要修改对应Grid的DataContext绑定即可,比如:
<!-- 绑定P2的Grid --> <Grid DataContext="{Binding P2}"> <TextBox Text="{Binding Name}"/> <TextBox Text="{Binding Age}"/> </Grid>
这样每个Grid都可以独立绑定不同的Person实例,子控件的绑定语法也会变得简洁很多。
小补充:回到上层DataContext
如果某个子控件需要绑定ViewModel里的其他属性(而非当前Grid的Person实例),可以通过RelativeSource来指定上层的DataContext,比如:
<TextBox Text="{Binding DataContext.ViewModelProperty, RelativeSource={RelativeSource AncestorType=Grid}}"/>
内容的提问来源于stack exchange,提问作者mins
相关产品推荐
相关产品推荐

