2014-03-18 40 views
0

背景强制列表框重新呈现

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

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

目前,我使用这个重新渲染:

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

问:

上述代码片段形式的它的工作。所谓“样”,我的意思是,它最终使我的数据成为再次呈现,但只有当我滚动到列表的底部,然后向上滚动网页我试图重新渲染的项目。

1)我怎样才能重新渲染立即将数据,而不必四处滚动,以得到它的出现?

+0

为什么不直接绑定到一个文本框和公正IsReadOnly结合IsEditable(你将需要另一个财产,使bool或在转换器中做) – Paparazzi

+2

你可能这样做都是错误的。您应该使用'DataTrigger'来动态更改DataTemplates的内容或其他内容。或者在“IsReadOnly”时创建一个看起来像常规的“TextBlock”的“TextBox”。 –

回答

1

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