背景:
我有一个包含DataTemplates定义的项目的ListBox。现在,如果列表中的对象将属性IsEditable设置为true,则项目的属性信息将显示在文本框内(通过DataTemplate更改),而不是文本块(因此用户可以编辑该内容)列表项目)
IsEditable通过每个列表项内的按钮切换开/关。我被告知我们需要保持所有对象的状态一致,这意味着我不能重新绑定ItemsSource并丢失所有内容。
目前,我正在使用它来重新渲染:
this.lbPoints.Dispatcher.Invoke(DispatcherPriority.Render, new Action(() => { }));
问题:
前面提到的代码段 KIND OF 完成了它的工作。通过"有点",我的意思是,它确实最终导致我的数据被重新渲染,但只有当我滚动到列表的底部然后向上滚动回到项目时我才会这样做试图重新渲染。
1)如何立即重新呈现数据而无需滚动显示数据?
答案 0 :(得分:1)
那些评论的人是正确的,你会以错误的方式解决这个问题...... 很少需要强制ListBox
重新呈现。试图切换DataTemplate
s(尽管 可能),你可能会让自己更加悲痛。而不是考虑将TextBox.IsReadOnly
属性绑定到IsEditable
属性的数据:
<TextBox IsReadOnly="{Binding IsEditable}" Text="{Binding Text}" />
另一种方法是,当Grid
属性为DataTemplate
时,使用BooleanToVisibilityConverter
在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>