评论的人是正确的,你要对这个错误的方式...有很少需要力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”。 –