WPF将单个文本框绑定到集合对象或数组中的元素

时间:2010-10-27 12:18:38

标签: .net wpf vb.net wpf-controls binding

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

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

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

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

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

1 个答案:

答案 0 :(得分: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>

但是,如果您确实想要绑定单个TextBlock,可以通过实现IValueConverter来实现。然后,您将每个TextBlock绑定到集合,并使用具有适当索引的ConverterParameter。然后转换器只返回该索引处的字符串值。

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

如果您正在使用MVVM,另一种可能性是为数组的每个元素提供属性,并绑定到这些属性。但是,如果你这样做,我首先会质疑阵列的必要性。