XAML绑定BindableCollection提示无DataContext问题如何解决
问题根因
报错No DataContext found for Binding 'MyBindableCollection'和BindableCollection的定义、写法没有关系,核心是MainWindow没有设置有效的DataContext,XAML绑定找不到承载MyBindableCollection属性的源对象,自然无法识别绑定路径。
Caliburn.Micro默认按命名约定自动完成View和ViewModel的绑定:View名为MainWindow时,框架会自动查找同名的MainWindowViewModel作为其DataContext。你当前承载集合属性的类名为ClassWithBindable,不符合命名匹配规则,且你也没有手动给窗口指定DataContext,所以绑定直接失效。
修复方案
二选一即可:
方案1:遵循Caliburn.Micro约定自动绑定(推荐)
- 把承载集合属性的类重命名为
MainWindowViewModel,代码如下:
using System.Collections.Generic; using Caliburn.Micro; namespace CaliburnTest { public class MainWindowViewModel { public BindableCollection<TestElement> MyBindableCollection { get; set; } public MainWindowViewModel() { var testElements = new List<TestElement>() { new TestElement(), new TestElement() }; MyBindableCollection = new BindableCollection<TestElement>(testElements); } } }
- 添加Caliburn.Micro启动引导类,替换WPF默认启动逻辑:
using System.Windows; using Caliburn.Micro; namespace CaliburnTest { public class Bootstrapper : BootstrapperBase { public Bootstrapper() { Initialize(); } protected override void OnStartup(object sender, StartupEventArgs e) { DisplayRootViewForAsync<MainWindowViewModel>(); } } }
- 修改
App.xaml,删除默认的StartupUri配置,添加Bootstrapper资源:
<Application x:Class="CaliburnTest.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:CaliburnTest"> <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary> <local:Bootstrapper x:Key="Bootstrapper"/> </ResourceDictionary> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources> </Application>
方案2:手动指定DataContext(无需修改类名、不用引导类)
直接在MainWindow.xaml.cs的构造函数中给窗口赋值DataContext,代码如下:
using System.Windows; namespace CaliburnTest { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DataContext = new ClassWithBindable(); } } }
补充说明
你写的TestElement类、BindableCollection初始化逻辑、XAML内的ItemTemplate绑定本身都没有问题,DataContext配置正确后即可正常显示列表内容,不需要反复重启VS、重新生成项目或是调整属性的命名空间位置。
内容的提问来源于stack exchange,提问作者Althos
相关产品推荐
相关产品推荐

