主页 > 创业  > 

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

【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 是单向绑定。

区别分析

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

TextBox 的 Text 绑定默认是双向绑定 (Mode=TwoWay)。但是你的 CameraList 是 List<string>,其中的 string 是不可修改的值类型,WPF 不能将 TextBox.Text 的值回写到 string,所以绑定失败。

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 变成单向绑定。🚀
标签:

【WPF】绑定报错:双向绑定需要Path或XPath由讯客互联创业栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“【WPF】绑定报错:双向绑定需要Path或XPath