WPF: при переходе на другую страницу все мои данные ListView исчезают - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть WPF приложение с 2 страницами и это Frame:

<Window>

<Window.DataContext>
        <common:ViewModel/>
</Window.DataContext>

  <Grid Name="GridMain" Grid.Row="1">
      <Frame Name="MyFrame"
              NavigationUIVisibility="Hidden"
              Source="Pages/home.xaml"/>
  </Grid>
</Window>

Итак, у меня есть 2 Pages

Home.xaml
Options.xaml

И мой ViewModel:

public class ViewModelBase : INotifyPropertyChanged
{

    private ObservableCollection<MyData> files;
    public ICommand SliderSpeedValueChangedCommand { get; set; }

    public ViewModelBase()
    {
        Files = new ObservableCollection<MyData>();
        SliderSpeedValueChangedCommand = new SliderSpeedValueChangedCommand(this);
    }

    public ObservableCollection<MyData> Files
    {
        get { return files; }
        set
        {
            files = value;
            NotifyPropertyChanged();
        }
    }
}

Так что в моем HomePage у меня есть это ListView:

<ListView Name="ListViewFiles"
          ItemsSource="{Binding Files}"/>

И пользователь выбирает файлы, которые добавляются в этот ListView.

Сейчаскогда пользователь переключается на другой Page (Options.xaml), а затем переключается обратно на HomePage, все файлы внутри этого ListView исчезают.

Внутри этих 2 страниц у меня также есть это:

<Page.DataContext>
    <viewmodel:ViewModelBase/>
</Page.DataContext>

<Page.Resources>
    <vm:ViewModelBase x:Key="ViewModelBase"/>
</Page.Resources>

Что я делаю не так?

Обновление

Вот как я переключаюсь между Pages:

public partial class MainWindow : Window
{
    public ViewModel viewModel;
     private Home home;
     private Options options;

public MainWindow()
{
    InitializeComponent();
    viewModel = new ViewModel();
    home = new Home();
    options = new Options();
}

    private void ListBoxMenu_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        int index = ListBoxMenu.SelectedIndex;
        switch (index)
        {
            case 0:
                MyFrame.Content = home;
                break;

            case 1:
                MyFrame.Content = options;
                break;
        }
    }
}

РЕДАКТИРОВАТЬ

Итак, у меня есть простая команда:

public class AddFilesCommand : ICommand
    {
        public event EventHandler CanExecuteChanged;

        public ViewModelBase ViewModel { get; set; }

        public AddFilesCommand(ViewModelBase viewModel)
        {            
            ViewModel = viewModel;
        }

        public bool CanExecute(object parameter)
        {
            return !ViewModel.AddingFiles;
        }

        public void Execute(object parameter)
        {
            ViewModel.AddFile();
        }
    }

А внутри ViewModelBase не могу я инициировать этот класс:

AddFilesCommand = new AddFilesCommand(this);

И просто Button:

<Button Command="{Binding AddFilesCommand}"/>

И после нажатия этой Button функция Execute не вызывается.

1 Ответ

0 голосов
/ 15 февраля 2019

Когда вы пишете следующее в своем XAML, он создает новый экземпляр класса ViewModel и устанавливает для него свойство DataContext:

<Window.DataContext>
    <common:ViewModel/>
</Window.DataContext>

Поскольку вы создаете ViewModelпрограммно вы должны избавиться от этой разметки.Создайте отдельный экземпляр модели представления для каждого вида и сделайте только это, например:

public partial class MainWindow : Window
{
    private readonly Home home;
    private readonly Options options;

    public MainWindow()
    {
        InitializeComponent();
        DataContext = new ViewModel();
        home = new Home() { DataContext = new ViewModelBase() };
        options = new Options() { DataContext = new ViewModelBase() };
    }

    private void ListBoxMenu_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        int index = ListBoxMenu.SelectedIndex;
        switch (index)
        {
            case 0:
                MyFrame.Content = home;
                break;

            case 1:
                MyFrame.Content = options;
                break;
        }
    }
}

И удалите этот материал:

<Page.DataContext>
    <viewmodel:ViewModelBase/>
</Page.DataContext>

<Page.Resources>
    <vm:ViewModelBase x:Key="ViewModelBase"/>
</Page.Resources>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...