Почему Listbox SelectedItem возвращает нулевое значение? - PullRequest
0 голосов
/ 27 апреля 2018

Я хотел бы создать список со связыванием ItemsSource и SelectedItem на объекте модели.

Привязка выполняется следующим образом:

  <ItemsControl ItemsSource="{Binding Persons}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Path=Name}" Width="150" />
                    <ListBox 
                        BorderThickness="0"
                        Background="Transparent"
                        Margin="0 1"
                        ItemsSource="{Binding DataContext.Skills,RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},Mode=OneWay}"
                        SelectedItem="{Binding MasterSkill, Mode=TwoWay}"
                        SelectionMode="Single"
                        ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                        >
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

При первой загрузке работает, значение выбирается с зарегистрированными данными по умолчанию.

Проблема появляется после переключения / перезагрузки текущего пользовательского интерфейса viewModel. Когда я возвращаюсь к ViewModel, SelectItem имеет значение null.

Значения обновляются после / после выхода из пользовательского интерфейса (при выгрузке). Проблема исчезает, когда я использую delay (> 0) свойство или когда я устанавливаю UpdateSourceTrigger в LostFocus

Я создал пример моей проблемы на Github => здесь (В примере вы должны зайти в окно «Управление навыками» и переключиться в «Управление проектом», чтобы, наконец, вернуться к навыкам)

Я думаю, что поток пользовательского интерфейса вызывает событие propertyChanged, когда элемент управления выгружается или уничтожается ... но я действительно не знаю, как избежать этой проблемы.

Большое спасибо за вашу помощь.

1 Ответ

0 голосов
/ 27 апреля 2018

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

switch (targetViewModel)
            {
                case "1":
                    CurrentViewModel = new ProjectViewModel();
                    break;
                case "2":
                    CurrentViewModel = new ManageSkillsViewModel();
                    break;
                default:
                    CurrentViewModel = null;
                    break;
            }

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

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