Итак, у меня есть MainWindow.xaml
, в котором DataContext из BaseViewModel
установлен следующим образом.
<Window.DataContext>
<viewModel:BaseViewModel/>
</Window.DataContext>
, он работает нормально, например, когда я выбираю элемент в ListView, он связывает и обновляет мойImageView в моем MainWindow.
<ListView Background="Transparent"
ItemsSource="{Binding ImageGridViewModel.Images}"
SelectedItem="{Binding ImageGridViewModel.SelectedImage}">
А потом он обновляется примерно так:
<Image Source="{Binding ImageGridViewModel.SelectedImage}"
Margin="20">
Идеально без проблем.
Однако я недавно добавилвторое представление, которое Window
называется WatermarkWindow
, и я устанавливаю DataContext
точно так же, как я сделал с MainWindow, в XAML, как это.
<Window.DataContext>
<viewModel:BaseViewModel/>
</Window.DataContext>
И затем привязка для Image
элемент управления этого нового Window
<Image Source="{Binding ImageGridViewModel.SelectedImage}"
Margin="20">
Однако, когда я открываю это окно, источник элемента управления Image
не привязан к свойству, свойство фактически возвращает NULL
, и я думаю, что я знаю,почему, я думаю, это потому, что в моем BaseViewModel
я создаю экземпляр new
экземпляра этого ViewModel всегда, когда он вызывается.
Причина, по которой я так поступаю, заключается в том, что я хотелсоздать экземпляр этого экземпляра, чтобы я мог использовать его для связывания вещей.Вместо того, чтобы быть нулевым.
Если это не проблема, тогда я все еще очень хочу узнать и понять, в чем проблема.Как правильно настроить BaseViewModel
, который содержит все дополнительные ViewModels?
public class BaseViewModel : ObservableObject
{
public ImageGridViewModel ImageGridViewModel { get; set; } = new ImageGridViewModel();
}
И ObservableObject
public class ObservableObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
И не то, чтобы это имело значение, потому что я знаю, что свойства работаютхорошо, вот ViewModel.
public class ImageGridViewModel
{
public string ImagePath { get; set; }
public string SelectedImage { get; set; }
public ObservableCollection<string> Images { get; set; }
...