0

背景

我有一个 ListBox 包含由 DataTemplates 定义的项目。现在,如果列表中的对象将属性 IsEditable 设置为 true,则项目的属性信息将显示在文本框内(通过 DataTemplate 更改),而不是文本块(因此用户可以编辑该列表项的内容)

IsEditable 通过每个列表项内的按钮打开/关闭。有人告诉我,我们需要保持所有对象的状态一致,这意味着我不能只是重新绑定 ItemsSource 并丢失所有内容。

目前,我正在使用它来重新渲染:

this.lbPoints.Dispatcher.Invoke(DispatcherPriority.Render, new Action(() => { }));

问题:

前面提到的代码片段KIND OF完成了它的工作。通过“某种”,我的意思是,它最终确实会导致我的数据重新渲染,但只有当我滚动到列表底部然后向上滚动到我试图重新渲染的项目时。

1)我怎样才能立即重新渲染数据而不必滚动显示它?

4

1 回答 1

1

评论的人是对的,你正在以错误的方式解决这个问题......很少需要强制 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>
于 2014-03-18T21:52:34.097 回答