У меня есть 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;
}
}