当前位置: 首页 > news >正文

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

背景

最开始使用的是 TextBlock:

<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后报错

<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 绑定当前项:

<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

<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

<TextBox Text="{Binding Mode=OneWay}" Foreground="Green"/>

或者使用 {Binding .}

<TextBox Text="{Binding .}" Foreground="Green"/>

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

总结

  • TextBlock.Text 只读,不回写,所以绑定 string 没问题。
  • TextBox.Text 需要写回,string 不是 DependencyObject,无法写回,所以报错。
  • 解决方案:使用 Mode=OneWay 或者 {Binding .}TextBox 变成单向绑定。🚀

相关文章:

  • vscode 安装 sqltools
  • 解决局域网访问Dify却仅显示nginx页面的问题
  • Mysql的索引失效
  • 基于JAVA+Spring+mysql_快递管理系统源码+设计文档
  • 网络流算法: Dinic算法
  • 【3天快速入门WPF】12-MVVM
  • BDF报告翻译简介后:关于A φ方法criterion引理1如何由范数导出内积
  • 基于大数据的民宿旅馆消费数据分析系统
  • 《国密算法开发实战:从合规落地到性能优化》
  • 永磁同步电机无速度算法--反电动势观测器
  • CAD实现一键 面域转线(闭合多段线)——CAD c#二次开发
  • “Web渗透测试实战指南|BWAPP靶场全关卡通关教程(含高中低/不可能级别)从SQL注入到XSS攻击手把手教学|网络安全工程师必备技能“ 内容较长点赞收藏哟
  • 网络类型及数据链路层协议
  • 南京观海微电子----AC-DC 非隔离电源方案在硬件设计开发
  • 万字详解 MySQL MGR 高可用集群搭建
  • 微软Office 2016-2024 x86直装版 v16.0.18324 32位
  • Java中Scanner的用法
  • Spring Boot3+Vue3极速整合: 10分钟搭建DeepSeek AI对话系统(进阶)
  • 面向实时性的超轻量级动态感知视觉SLAM系统
  • Netty介绍
  • 如何java做网站/seo关键词优化经验技巧
  • 案例学——网页设计与网站建设/无锡网站制作无锡做网站
  • 中国有哪些b2b的企业/朝阳区搜索优化seosem
  • 移动商城网站建设 深圳/武汉推广系统
  • 大兴西红门网站建设/北京seo方法
  • 广告设计软件有哪些/seo查询软件