同一页面多次赋值DataContext仅首个生效、XAML绑定报错咨询
问题根源
DataContext 是单对象绑定源属性,连续多次赋值会直接覆盖之前的绑定源,仅最后一次赋值的对象会作为全局绑定生效,之前绑定到被覆盖对象的属性路径全部会触发XAML属性查找失败异常。
可行解决方案
以下方案均不需要额外构建单一聚合绑定类:
方案1:拆分页面区域单独指定DataContext
不需要给整个页面设置统一DataContext,将页面按业务拆分为独立功能块,给不同块单独赋值绑定源:
// 示例:ULS相关内容放在UlsPanel容器,条码相关内容放在BarcodePanel容器 pages.Home.UlsPanel.DataContext = myULSData; pages.Home.BarcodePanel.DataContext = myBarcode;方案2:绑定直接指定源对象
把两个数据源注册为页面资源,绑定属性时显式指定绑定源,不需要设置全局DataContext:
- 先在XAML中注册资源:
<Page.Resources> <local:ULS_Data x:Key="ULSDataSource" /> <local:Barcode x:Key="BarcodeDataSource" /> </Page.Resources>- 绑定时指定Source参数:
<!-- 绑定ULS类属性 --> <TextBlock Text="{Binding UlsRelatedProperty, Source={StaticResource ULSDataSource}}" /> <!-- 绑定Barcode类的BatchID属性 --> <TextBlock Text="{Binding BatchID, Source={StaticResource BarcodeDataSource}}" />方案3:匿名类快速聚合两个数据源(零额外编码成本)
直接用C#匿名类把两个对象打包作为全局DataContext,不需要单独定义新的聚合类:
pages.Home.DataContext = new { ULS = myULSData, Barcode = myBarcode };绑定属性时加对应前缀即可:
<TextBlock Text="{Binding ULS.UlsRelatedProperty}" /> <TextBlock Text="{Binding Barcode.BatchID}" />方案4:CompositeCollection 多源集合绑定(仅适用于列表类场景)
如果是同一列表需要展示两个数据源的内容,用
CompositeCollection直接合并多个数据源即可,不需要修改原有业务类。
内容的提问来源于stack exchange,提问作者MichaelInMA
相关产品推荐
相关产品推荐

