WPF中AutoCompleteBehavior绑定TestItems提示无DataContext如何解决
修复方案
报错根本原因
WPF的{Binding}默认会沿元素树向上查找控件的DataContext属性作为绑定源,你的TestItems是MainWindow类本身的属性,但你没有指定绑定源,也没有给窗口设置DataContext,因此绑定引擎找不到目标属性。
可选修复方法
方法1:设置窗口自身为DataContext(最适合当前测试场景)
直接在主窗口构造函数的InitializeComponent后添加代码,将窗口自身设为DataContext,同时记得初始化TestItems实例,否则即使绑定成功也没有数据:
public MainWindow() { InitializeComponent(); // 新增以下两行 this.DataContext = this; TestItems = new ObservableCollection<string>{"测试项1", "测试项2", "SQL关键词1"}; SQLText.TextChanged += SQLTextTextChanged; CreateInitialTree(); }
方法2:XAML绑定指定源(无需修改后台DataContext)
如果你不想修改窗口的DataContext,可以直接在绑定语句里指定源为当前窗口,两种写法选一种即可:
- 用
RelativeSource查找父级窗口:
behaviors:AutoCompleteBehavior.AutoCompleteItemsSource="{Binding TestItems, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MainWindow}}}"
- 先给窗口设置
x:Name="RootWin",再用ElementName绑定:
<!-- 窗口标签加name属性 --> <Window x:Class="你的命名空间.MainWindow" x:Name="RootWin" ...其余属性> <!-- TextBox绑定修改为 --> behaviors:AutoCompleteBehavior.AutoCompleteItemsSource="{Binding TestItems, ElementName=RootWin}"
注意事项
如果后续需要动态替换TestItems的整个实例(不是增删集合内元素),需要让MainWindow实现INotifyPropertyChanged接口,在TestItems的setter中触发属性变更通知,否则UI不会感知到集合实例的变更。
内容的提问来源于stack exchange,提问作者user9922446
相关产品推荐
相关产品推荐

