2010-10-27 321 views
0

我需要将textblock.text属性绑定到可观察集合或数组元素中的单个元素,并使用INotifyPropertyChanged或INotifyCollectionChanged进行文本更新,以最佳者为准。WPF将单个文本框绑定到集合对象或数组中的元素

大多数示例都描述了如何将列表框或其他列表视图绑定到整个集合,但是我的应用程序需要根据数组中一个或多个元素的更改通知来更新屏幕上的多个文本块。

textblock1.Text = MYARRAY(0)... textblock2.Text = MYARRAY(1)... textblock3.Text = MYARRAY(2)... textblock4.Text = MYARRAY(3).. etc ...

是否可以将单个文本块绑定到单个数组元素?

如果任何指定的元素发生更改,是否可以获取将更新一个或多个文本块的正确类型的通知?

回答

2

所有的事情都可能在WPF中,这种方式或其他方式(或者通常都是这样,再加上一堆)。

首先简单的部分 - 如果您已经在数组中的对象上正确实现了INotifyPropertyChanged,则绑定应该正确更新。 INotifyCollectionChanged通知您集合中的元素是否已更改(即已添加/删除)。

这听起来像你正在尝试更新TextBlocks的未知数(甚至是已知数,它并不重要)。可能的,最好的方法是使用某种ItemsControl(ListBox是一个)和一个ItemsTemplate,以及可选的ItemsPanel。如果集合的定义发生变化,这将是最简单的维护方式。

例如,这里是一个ItemsControl示例。

<ItemsControl x:Name="itemsExample" 
       ItemsSource="{Binding MyCollection}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel HorizontalAlignment="Stretch" IsItemsHost="True" /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding SomeStringProperty}" Grid.Column="0" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

但是,如果你真的要绑定个人的TextBlocks,你可以通过实现IValueConverter做这件事。然后,您会将每个TextBlocks绑定到集合,并使用具有适当索引的ConverterParameter。转换器然后将返回该索引处的字符串值。

<TextBlock Text="{Binding MyCollection, 
          Converter={StaticResource myObjectConverter}, 
          ConverterParameter=0}" /> 

如果您使用的是MVVM,另一种可能性是为数组中的每个元素设置属性并绑定到这些属性。但是,如果你这样做,我首先会质疑阵列的需求。

+0

我们使用该数组提供一个动态数据源,该数据源由应用程序启动时从平面文件读入的数据组成。提供此数组数据的对象是一个自定义的.dll,并且我们编写了自己的事件以通知元素何时更改值。当这个自定义事件触发时,它触发我们WPF项目的代码隐藏中的事件处理程序。 – MBunds 2010-10-27 18:01:06

+0

使用适当的接口将“SomeTextBlock.text”绑定到“SomeArray(index)”会容易得多。 – MBunds 2010-10-27 18:10:05

+0

你的意思是什么,“适当的界面”? – 2010-10-27 18:59:54