【WPF】绑定报错:双向绑定需要 Path 或 XPath

背景

最开始使用的是 TextBlock:

xml 复制代码
<ItemsControl ItemsSource="{Binding CameraList}">
     <ItemsControl.ItemsPanel>
         <ItemsPanelTemplate>
             <StackPanel Orientation="Horizontal"/>
         </ItemsPanelTemplate>
     </ItemsControl.ItemsPanel>
     <ItemsControl.ItemTemplate>
         <DataTemplate>
             <GroupBox>
                 <TextBlock Text="{Binding}" Foreground="Green"/> 
             </GroupBox>
         </DataTemplate>
     </ItemsControl.ItemTemplate>
 </ItemsControl>  

后面将,TextBlock改为TextBox后报错

xml 复制代码
<ItemsControl ItemsSource="{Binding CameraList}">
     <ItemsControl.ItemsPanel>
         <ItemsPanelTemplate>
             <StackPanel Orientation="Horizontal"/>
         </ItemsPanelTemplate>
     </ItemsControl.ItemsPanel>
     <ItemsControl.ItemTemplate>
         <DataTemplate>
             <GroupBox>
                 <TextBox Text="{Binding}" Foreground="Green"/>
             </GroupBox>
         </DataTemplate>
     </ItemsControl.ItemTemplate>
 </ItemsControl>

报错信息如下

首先看如何解决这个报错问题。

方案 1:使用 {Binding .}

因为 CameraList 里的每个元素就是 string,直接使用 {Binding .}TextBox 绑定当前项:

xml 复制代码
<ItemsControl ItemsSource="{Binding CameraList}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <GroupBox>
                <TextBox Text="{Binding .}" Foreground="Green"/>
            </GroupBox>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

方案 2:绑定 Path 指定 Text

虽然 Binding . 已经可以解决问题,但你也可以显式指定 Path

xml 复制代码
<TextBox Text="{Binding Path=.}" Foreground="Green"/>

Path 在绑定 List<string> 时通常可以省略。

这样就能正确绑定 List<string> 里的每个字符串到 TextBox 里。🚀且不会报错!

为啥用TextBlock这样写不报错?

TextBox 绑定报错,而 TextBlock 没有报错,主要是因为 TextBox.Text 默认是双向绑定,而 TextBlock.Text 是单向绑定

区别分析

  1. TextBox.Text="{Binding}"(默认是 Mode=TwoWay

    • TextBoxText 绑定默认是双向绑定 (Mode=TwoWay)。
    • 但是你的 CameraListList<string>,其中的 string不可修改的值类型 ,WPF 不能将 TextBox.Text 的值回写到 string,所以绑定失败。
  2. TextBlock.Text="{Binding}"(默认是 Mode=OneWay

    • TextBlock 只需要读取 string 值,不需要回写,因此不会有绑定问题。

解决方案

使用 TextBox,可以将 Binding 设置为 Mode=OneWay

xml 复制代码
<TextBox Text="{Binding Mode=OneWay}" Foreground="Green"/>

或者使用 {Binding .}

xml 复制代码
<TextBox Text="{Binding .}" Foreground="Green"/>

这样 TextBox 只读 string,不会尝试写回,就不会报错了。

总结

  • TextBlock.Text 只读,不回写,所以绑定 string 没问题。
  • TextBox.Text 需要写回,string 不是 DependencyObject,无法写回,所以报错。
  • 解决方案:使用 Mode=OneWay 或者 {Binding .}TextBox 变成单向绑定。🚀
相关推荐
5008415 小时前
ATC 做了什么:从 ONNX 到 .om
分布式·架构·开源·wpf·开源鸿蒙
5008417 小时前
Graph Engine 是什么,为什么需要它
java·人工智能·性能优化·ocr·wpf
一念春风20 小时前
.md文件浏览器
c#·wpf
lingxiao1688820 小时前
Wpf常用样式与自定义控件(仪表盘,管道,分页器等)
wpf
LateFrames1 天前
520 - 如何说晚安 (WPF)
c#·wpf·浪漫·ui体验
heimeiyingwang2 天前
【架构实战】日志体系ELK:集中化日志管理实践
elk·架构·wpf
CPU不够了2 天前
WPF 多选下拉+搜索过滤_wpf下拉选项增加搜索
wpf
FuckPatience2 天前
WPF 列表控件自动拉伸子元素的宽度
wpf
LCG元2 天前
【Go后端开发】从 0 到生产级:高性能分布式网关全实现 + 接口限流熔断降级实战
分布式·golang·wpf
枫叶林FYL2 天前
项目九:异步高性能爬虫与数据采集中枢 —— 基于 Crawl<sub>4</sub>AI 与 Playwright 的现代化数据采集平台 项目总览
爬虫·python·深度学习·wpf