WPF Привязка отдельных текстовых полей к элементу в объекте коллекции или массиве - PullRequest
0 голосов
/ 27 октября 2010

Мне нужно привязать свойство textblock.text к одному элементу в наблюдаемой коллекции или элементу массива и обновить текст, используя INotifyPropertyChanged или INotifyCollectionChanged, в зависимости от того, что лучше.

В большинстве примеров описываются способы привязки списков или других представлений списков ко всем коллекциям, но моему приложению необходимо обновить несколько текстовых блоков на экране в зависимости от уведомления об изменении одного или нескольких элементов массива.

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

Можно ли привязать один текстовый блок к одному элементу массива?

Можно ли получить уведомление о правильном типе, который обновит один или несколько текстовых блоков при изменении какого-либо назначенного элемента?

1 Ответ

2 голосов
/ 27 октября 2010

Все вещи возможны в 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, другой возможностью является наличие свойств для каждого из элементов вашего массива и привязка к этим свойствам. Однако, если вы делаете это, я бы поставил под сомнение необходимость использования массива.

...