Как мне использовать одну и ту же ViewModel для двух представлений? - PullRequest
0 голосов
/ 10 марта 2019

Итак, у меня есть 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; }
...

1 Ответ

0 голосов
/ 11 марта 2019

В итоге я установил для свойства DataContext значение this, в котором я создал новый WawtermarkWindow

if (wmw == null)
   {
       wmw = new WatermarkWindow();
       wmw.DataContext = this;
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...