Привязать команду ViewModel к другому окну просмотра? - PullRequest
1 голос
/ 03 июля 2019

У меня есть ListBox в моем UserControl, который отображается в моем главном окне. Моя ViewModel для главного окна содержит две ICommands, удалить и добавить из списка. Я успешно привязал свою команду удаления к списку из главного окна. Тем не менее, у меня есть отдельное окно, которое открывается из главного окна, которое включает кнопку для добавления ListBoxItem в список. Мое главное окно ViewModel не существует в контексте второго окна. Я не могу создать экземпляр другой ViewModel, так как он не будет содержать элементы, которые уже существуют в моей коллекции ObservableCollection, найденной в ViewModel.

Как я могу решить эту проблему с помощью MVVM? Должен ли я создать другую ViewModel для второго окна View? Если так, как я могу гарантировать, что все мои существующие ранее ListBoxItems видны ему?

Обновление: По запросу, минимальный код.

Мой UserControl, содержащий мой ListBox:

<UserControl>  
    <Grid>
        <StackPanel>
            <ListBox x:Name="lstBox" ItemsSource="{Binding myList}" DisplayMemberPath="Desc">
            </ListBox>
            <Button x:Name="btn_Remove" Content="Remove" Command="{Binding RemoveCommand}" 
                    CommandParameter="{Binding ElementName=lstBox, Path=SelectedIndex}"/>
        </StackPanel>
    </Grid>
</UserControl>

Моя MainWindow ViewModel, содержащая ICommands:

  public class MainWindowViewModel {

      private RelayCommand removeCommand;
      private RelayCommand addCommand;

      public ObservableCollection<myObjModel> MyList {
          get;
          set;
      }

      public void createList() {
          ObservableCollection<myObjModel> myList = new ObservableCollection<myObjModel>();
          myList.Add(new myObjModel { Desc = "test" });
          MyList = myList;
      }

      public ICommand RemoveCommand {
          get {
              if (removeCommand == null) {
                  removeCommand = new RelayCommand(param => remove((int)param));
              }
              return removeCommand;
          }
      }

      public void remove(int i) {
          MyList.RemoveAt(i);
      }

      public ICommand AddCommand {
          get {
              if (addCommand == null) {
                  addCommand = new RelayCommand(param => add((string)param));
              }
              return addCommand;
          }
      }

      public void add(string desc) {
          Telegrams.Add(new TelegramyObjModelmModel { Desc = desc });
      }
 }

Мой MainWindow XAML:

<Window
xmlns:uc="clr-namespace:myClass">
    <Grid>
        <uc:UserControl x:Name="myUserControl" Loaded="myUserControl_Loaded"/>
    </Grid>
</Window>

За которым следует код

    public partial class MainWindow : Window {

    MainWindowViewModel ViewModelObject;

           public MainWindow() {
            InitializeComponent();
        }

            private void myUsereControl_Loaded(object sender, RoutedEventArgs e) {
            ViewModelObject = new MainWindowViewModel();
            ViewModelObject.createList();
            myUsereControl_Loaded.DataContext = ViewModelObject;
        }
      }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...