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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF将单个文本框绑定到集合对象或数组中的元素相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

答案

在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来实现。然后,您将每个TextBlock绑定到集合,并使用具有适当索引的ConverterParameter。然后转换器将返回该索引处的字符串值。

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

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

以上是关于WPF将单个文本框绑定到集合对象或数组中的元素的主要内容,如果未能解决你的问题,请参考以下文章

强制验证 WPF 中的绑定控件

如何将通用项目添加到绑定到 WPF 中的集合的 ComboBox

WPF双向绑定不起作用

如何使用WPF从bindingexpression解析绑定对象?

椭圆 WPF 中的文本框

WPF学习第三十章 元素绑定——绑定到非元素对象