評論的人是正確的,你要對這個錯誤的方式...有很少需要力ListBox
重新呈現。你可能會造成自己的一些額外的悲痛嘗試切換DataTemplate
S(雖然它是可能)。取而代之的是,想想數據TextBox.IsReadOnly
屬性綁定到你的IsEditable
屬性:
<TextBox IsReadOnly="{Binding IsEditable}" Text="{Binding Text}" />
另一種方法是使用BooleanToVisibilityConverter
顯示在您的DataTemplate
不同Grid
當你IsEditable
屬性是true
。不幸的是,Converter
沒有相反的操作,因此您可以創建一個IsNotEditing
屬性,以綁定到最初顯示的DataTemplate
中的Grid
。我不知道這是明確的......看到這個例子:
<DataTemplate DataType="{x:Type YourPrefix:YourDataType}">
<Grid>
<Grid Visibility="{Binding IsNotEditing, Converter={StaticResource
BooleanToVisibilityConverter}}">
<!-- Define your uneditable UI here -->
</Grid>
<Grid Visibility="{Binding IsEditing, Converter={StaticResource
BooleanToVisibilityConverter}}">
<!-- Define your editable UI here -->
</Grid>
</Grid>
</DataTemplate>
你也可以定義自己的BooleanToVisibilityConverter
類,它具有一個IsInverted
屬性,因此,你可以只使用一個IsEditing
財產。你需要聲明兩個Converters
的是,像這樣的:
<Converters:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" />
<Converters:BoolToVisibilityConverter x:Key="InvertedBoolToVisibilityConverter"
IsInverted="True" />
那麼你的XAML會是這樣的:
<Grid Visibility="{Binding IsEditing, Converter={StaticResource
InvertedBoolToVisibilityConverter}}">
<!-- Define your uneditable UI here -->
</Grid>
<Grid Visibility="{Binding IsEditing, Converter={StaticResource
BoolToVisibilityConverter}}">
<!-- Define your editable UI here -->
</Grid>
爲什麼不直接綁定到一個文本框和公正IsReadOnly結合IsEditable(你將需要另一個財產,使bool或在轉換器中做) – Paparazzi
你可能這樣做都是錯誤的。您應該使用'DataTrigger'來動態更改DataTemplates的內容或其他內容。或者在「IsReadOnly」時創建一個看起來像常規的「TextBlock」的「TextBox」。 –