评论的人是对的,你正在以错误的方式解决这个问题......很少需要强制 aListBox
重新渲染. 您可能会在尝试切换DataTemplate
s 时给自己带来一些额外的悲伤(尽管这是可能的)。取而代之的是,考虑将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>