XAML多页面绑定问题:如何实现单页面绑定多个其他页面的数据源
多数据源绑定实现方案
1. Page2.cs 后台代码实现绑定
无需将Page2的整体BindingContext设置为Page1实例,直接为单个控件指定绑定源即可,示例代码如下:
// 提前获取到Page1的实例对象,命名为page1Instance // 给ListView绑定Page1中的energyX集合 yourListViewName.SetBinding(ListView.ItemsSourceProperty, new Binding("energyX") { Source = page1Instance }); // 给Label绑定对应Score属性,示例为绑定ListView选中项的Score yourLabelName.SetBinding(Label.TextProperty, new Binding("SelectedItem.Score") { Source = yourListViewName });
2. 多数据源绑定的可选方案
方案说明
MultiBinding适用于将多个属性值聚合后赋值给同一个控件属性的场景(比如将姓氏、名字两个属性拼接为全名显示),不适合你当前需要为不同控件指定不同数据源的需求,不需要使用MultiBinding。
推荐两种可行方案:
方案1:控件单独指定绑定源(改动最小)
不管是XAML还是后台代码,都可以直接给每个控件单独指定Source属性,实现绑定不同数据源:
XAML写法示例:
<!-- 先在Page2的资源中引入需要用到的多个页面实例 --> <ContentPage.Resources> <local:Page1 x:Key="Page1Instance" /> <local:OtherPage x:Key="OtherPageInstance" /> </ContentPage.Resources> <!-- 绑定Page1的energyX集合 --> <ListView ItemsSource="{Binding energyX, Source={StaticResource Page1Instance}}" /> <!-- 绑定其他页面的Score属性 --> <Label Text="{Binding Score, Source={StaticResource OtherPageInstance}}" />
方案2:聚合ViewModel(符合MVVM规范,更易维护)
单独创建Page2专属的ViewModel类,将所有需要用到的数据源都作为该ViewModel的属性,再将这个ViewModel设为Page2的BindingContext即可:
// Page2ViewModel.cs 定义 public class Page2ViewModel : INotifyPropertyChanged { // 聚合所需的所有数据源属性 public ObservableCollection<EnergyX> Page1EnergyList { get; set; } public string OtherPageScore { get; set; } // 此处省略INotifyPropertyChanged接口实现代码 }
Page2中赋值绑定上下文:
BindingContext = new Page2ViewModel { Page1EnergyList = page1Instance.energyX, OtherPageScore = otherPageInstance.Score };
XAML中直接绑定属性即可:
<ListView ItemsSource="{Binding Page1EnergyList}" /> <Label Text="{Binding OtherPageScore}" />
内容的提问来源于stack exchange,提问作者Behzad Changizi
相关产品推荐
相关产品推荐

