背景
最開始使用的是 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
變成單向綁定。🚀