【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 变成单向绑定。🚀
相关推荐
code bean1 天前
【WPF】WPF 自定义控件之依赖属性
wpf
上元星如雨1 天前
WPF 加载和显示 GIF 图片的完整指南
wpf
微小冷2 天前
WPF中ListView控件详解
c#·wpf·数据绑定·listview·bingding
专注VB编程开发20年3 天前
WPF,Winform,HTML5网页,哪个UI开发速度最快?
大数据·c#·wpf
YANQ6623 天前
3.1 WPF画折线图、直方图、饼状图
wpf
上元星如雨3 天前
WPF demo:全屏加载界面
wpf
深漂阿碉3 天前
WPF自定义日历选择控件
wpf
六点的晨曦3 天前
WPF的三轴机械手控件动画
wpf
军训猫猫头4 天前
5.浏览本地文件获取路径与文件名称 C#例子 WPF例子
开发语言·c#·wpf
步、步、为营4 天前
.NET + WPF框架开发聊天、网盘、信息发布、视频播放功能
.net·wpf·音视频