【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 变成单向绑定。🚀
相关推荐
玉面小君3 天前
从 WPF 到 Avalonia 的迁移系列实战篇6:Trigger、MultiTrigger、DataTrigger 的迁移
wpf·avalonia
招风的黑耳4 天前
Java生态圈核心组件深度解析:Spring技术栈与分布式系统实战
java·spring·wpf
lfw20194 天前
WPF 数据绑定模式详解(TwoWay、OneWay、OneTime、OneWayToSource、Default)
wpf
Magnum Lehar4 天前
3d wpf游戏引擎的导入文件功能c++的.h实现
3d·游戏引擎·wpf
FuckPatience5 天前
WPF Telerik.Windows.Controls.Data.PropertyGrid 自定义属性编辑器
wpf
almighty275 天前
C#WPF控制USB摄像头参数:曝光、白平衡等高级设置完全指南
开发语言·c#·wpf·usb相机·参数设置
军训猫猫头6 天前
12.NModbus4在C#上的部署与使用 C#例子 WPF例子
开发语言·c#·wpf
我要打打代码6 天前
在WPF项目中使用阿里图标库iconfont
wpf
拾忆,想起6 天前
Redisson 分布式锁的实现原理
java·开发语言·分布式·后端·性能优化·wpf
weixin_464078076 天前
wpf依赖注入驱动的 MVVM实现(含免费源代码demo)
wpf