Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net WPF将单个文本框绑定到集合对象或数组中的元素_.net_Wpf_Vb.net_Wpf Controls_Binding - Fatal编程技术网

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

.net WPF将单个文本框绑定到集合对象或数组中的元素,.net,wpf,vb.net,wpf-controls,binding,.net,Wpf,Vb.net,Wpf Controls,Binding,我需要将textblock.text属性绑定到可观察集合或数组元素中的单个元素,并使用INotifyPropertyChanged或INotifyCollectionChanged更新文本,以最好的为准 大多数示例描述了将列表框或其他列表视图绑定到整个集合的方法,但我的应用程序需要根据数组中一个或多个元素的更改通知更新屏幕上的几个文本块 textblock1.Text = MyArray(0)... textblock2.Text = MyArray(1)... textblock3.Text

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

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

textblock1.Text = MyArray(0)...
textblock2.Text = MyArray(1)...
textblock3.Text = MyArray(2)...
textblock4.Text = MyArray(3)...
etc...
是否可以将单个textblock绑定到单个数组元素


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

在WPF中,所有事情都可以以一种或另一种方式进行(或者,通常,两者都可以,再加上更多)

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

听起来你好像在尝试更新未知数量的文本块(或者甚至是已知数量,其实并不重要)。很可能,最好的方法是使用某种类型的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绑定到集合,并使用具有适当索引的ConverterParameter。然后转换器将只返回该索引处的字符串值

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


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

我们使用阵列提供一个动态数据源,由应用程序启动时从平面文件读入的数据组成。提供此数组数据的对象是一个自定义的.dll,我们编写了自己的事件,以便在元素更改值时发出通知。当触发此自定义事件时,它会触发WPF项目代码隐藏中的事件处理程序。使用适当的接口将“SomeTextBlock.text”绑定到“SomeArray(index)”会更容易。什么是“适当的接口”?如果要“绑定”代码隐藏中的文本(几乎与你在评论中所发布的内容一字不差),你当然可以。它不是很“WPF'y”,但会起作用。