评论的人是对的,你正在以错误的方式解决这个问题......很少需要强制 aListBox重新渲染. 您可能会在尝试切换DataTemplates 时给自己带来一些额外的悲伤(尽管这是可能的)。取而代之的是,考虑将TextBox.IsReadOnly属性绑定到您的IsEditable属性的数据:
<TextBox IsReadOnly="{Binding IsEditable}" Text="{Binding Text}" />
另一种选择是使用 aBooleanToVisibilityConverter来显示您的不Grid同时DataTemplate您的IsEditable属性是true。不幸的是,它Converter没有逆运算,因此您可以创建一个IsNotEditing属性来绑定到最初显示Grid的 中。DataTemplate我不确定这是否清楚......见这个例子:
<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>