Изменения в ItemsSource элемента ItemsControl не обновляются в пользовательском интерфейсе при изменении вкладки в TabControl - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь создать приложение wpf с несколькими вкладками в TabControl, где одна вкладка представляет собой журнал.Кнопка на первой вкладке добавляет строку в журнал на второй вкладке.Когда кнопка нажата, она также отображает окно сообщения, содержащее длину ItemsSource журнала.Проблема:

  • Нажмите кнопку - появится окно с сообщением, показывающее 1 элемент в журнале
  • Переключитесь на вкладку журнала (показывает одну строку)
  • Переключитесь нанажмите кнопку.В окне сообщения отображаются 2 элемента в журнале.
  • Переключитесь на вкладку журнала, отображается только один элемент.

Полный код:

MainWindow.xaml

<Window x:Class="WpfApp2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp2"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <TabControl HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="10,10,10,10">
            <TabItem Header="Microcode Process" Name="MicrocodeProcessTab">
                <Button Content="Single Step" Margin="0,0,10,0" Click="SingleStep" Name="SingleStepButton"/>
            </TabItem>
            <TabItem Header="Log">
                <ScrollViewer>
                    <ItemsControl Name="LogList">
                        <ItemsControl.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding}"/>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>
                </ScrollViewer>
            </TabItem>
        </TabControl>
    </Grid>
</Window>

MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Windows;

namespace WpfApp2 { 
    public partial class MainWindow : Window {
        List<string> list = new List<string>();

        public MainWindow() {
            InitializeComponent();
            LogList.ItemsSource = list;
        }

        private void SingleStep(object sender, RoutedEventArgs e) {
            list.Add($"STEP");
            MessageBox.Show((LogList.ItemsSource as List<string>).Count.ToString());
            e.Handled = true;
        }
    }
}

1 Ответ

0 голосов
/ 20 декабря 2018

Технология WPF волшебным образом не обновляет цель при каждом изменении источника.Он поддерживает обновление пользовательского интерфейса с помощью некоторых механизмов уведомлений, таких как DependencyObject, INotifyPropertyChanged или INotifyCollectionChanged.

Тип данных, используемый для сбора (List<>), не имеет механизма уведомлений.Таким образом, пользовательский интерфейс обновляется только один раз при его создании, и никогда больше, поэтому вы видите, что элемент журнала добавляется только при первом переходе на вторую вкладку.

(не рекомендуется) Вы можете сделать это для ручного сбросаItemsSource каждый раз, когда в него вносятся изменения.Однако он всегда будет заново создавать все элементы пользовательского интерфейса в визуальном дереве ItemsControl.

private void SingleStep(object sender, RoutedEventArgs e)
{
    list.Add("STEP");
    LogList.ItemsSource = null;
    LogList.ItemsSource = list;
}

(рекомендуется) Вы можете реализовать привязку для вашего ItemsSource с помощью ObservableCollection - который реализует INotifyCollectionChanged -следующим образом:

ObservableCollection<string> _list = new ObservableCollection<string>();
public ObservableCollection<string> list { get { return _list; } }

Обратите внимание, что ObservableCollection автоматически уведомляет цель о любых изменениях, сделанных в коллекции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...