Информация об изменениях

Сообщение Re[6]: А что собственно сделали в Prism от 27.02.2020 19:50

Изменено 27.02.2020 19:51 okon

Re[6]: А что собственно сделали в Prism
Здравствуйте, karbofos42, Вы писали:

K>Здравствуйте, okon, Вы писали:


O>>го, вот и интересно что я не доглядел важного.


K>>>Реализуй с MVVM подходом на голом WPF и с Prism, станет понятно что это и зачем.


O>>Так вот у меня и получилось что подход с MVVM на голом и с Prism ничем не отличается кроме названия.

O>>Можешь привести кейс на основании которого ты говоришь что будет видно разницу ?

K>В главном окне кнопка и текстблок. При нажатии на кнопку нужно показать окно с текстом из текстблока.


Пример из призмы
https://prismlibrary.com/docs/wpf/dialog-service.html



Пример на WPF c MVVM без сторонних библиотек

<Application.Resources>
   <DataTemplate DataType="{x:Type MainWindowViewModel} >
      <TextBox Text={Binding InputText}" />
      <Button Command="{Binding ShowDialogCommand}" />
   </DataTemplate>

   <DataTemplate DataType="{x:Type ChildWindowViewModel} >
     <TextBlock Text={Binding Text} /> 
    </DataTemplate>
</Application.Resources>

public interface IDialogService 
{
   void ShowDialog(object dataContext);
}

public class DialogService : IDialogService
{
   public DialogService(IContainer container)
   {
     ....
   }
       
   void ShowDialog(object dataContext)
   {
      var window = container.Resolve<Window>(dataContext);
      window.ShowDialog();
   }
}

public class ParentWindowViewModel  : ....
{
   public MyViewModel(IDialogService dialogService, IContainter container) 
   {
       .... 
       ShowDialogCommand = new DelegateCommand(OnShowDialog);
   }

   private inputText;
   public string InputText { get => inputText set => Set(ref inputText, value); }

   public ICommand ShowDialogCommand {get;}

   public OnShowDialog(object parameter)
   { 
      var childWindowViewModel = container.Resolve<ChildWindowViewModel>(InputText);
      dialogService.ShowWindow(childWindowViewModel);
   }   
}


Пример на WPF c MVVM c библиотекой WpfToolkit

<Application.Resources>
   <DataTemplate DataType="{x:Type MainWindowViewModel} >
      <TextBox Text={Binding InputText}" />
      <Button Command="{Binding ShowDialogCommand}" />

      <wpfToolkit:ChildWindow  Opened="{Binding IsChildDialogOpened}" >
            <TextBlock Text={Binding InputText} /> 
      </wpfToolkit:ChildWindow>

   </DataTemplate>
</Application.Resources>


public class ParentWindowViewModel  : ....
{
   public MyViewModel() 
   {
       .... 
       ShowDialogCommand = new DelegateCommand(OnShowDialog);
   }

   private string inputText;
   public string InputText { get => inputText set => Set(ref inputText, value); }

   private bool isChildDialogOpened;
   public bool IsChildDialogOpened{ get => isChildDialogOpenedset => Set(ref isChildDialogOpened, value); }


   public ICommand ShowDialogCommand {get;}

   public OnShowDialog(object parameter)
   { 
      IsChildDialogOpened= true;
   }   
}



И в итоге опять спрашивается нафига еще одна сущность в виде библиотеки с именем Prism, может там это как-то красивее решается чем в примере из документации (https://prismlibrary.com/docs/wpf/dialog-service.html) ?
Re[6]: А что собственно сделали в Prism
Здравствуйте, karbofos42, Вы писали:

K>Здравствуйте, okon, Вы писали:


O>>го, вот и интересно что я не доглядел важного.


K>>>Реализуй с MVVM подходом на голом WPF и с Prism, станет понятно что это и зачем.


O>>Так вот у меня и получилось что подход с MVVM на голом и с Prism ничем не отличается кроме названия.

O>>Можешь привести кейс на основании которого ты говоришь что будет видно разницу ?

K>В главном окне кнопка и текстблок. При нажатии на кнопку нужно показать окно с текстом из текстблока.


Пример из призмы
https://prismlibrary.com/docs/wpf/dialog-service.html



Пример на WPF c MVVM без сторонних библиотек

<Application.Resources>
   <DataTemplate DataType="{x:Type MainWindowViewModel}” >
      <TextBox Text={Binding InputText}" />
      <Button Command="{Binding ShowDialogCommand}" />
   </DataTemplate>

   <DataTemplate DataType="{x:Type ChildWindowViewModel} >
     <TextBlock Text={Binding Text} /> 
    </DataTemplate>
</Application.Resources>

public interface IDialogService 
{
   void ShowDialog(object dataContext);
}

public class DialogService : IDialogService
{
   public DialogService(IContainer container)
   {
     ....
   }
       
   void ShowDialog(object dataContext)
   {
      var window = container.Resolve<Window>(dataContext);
      window.ShowDialog();
   }
}

public class ParentWindowViewModel  : ....
{
   public MyViewModel(IDialogService dialogService, IContainter container) 
   {
       .... 
       ShowDialogCommand = new DelegateCommand(OnShowDialog);
   }

   private inputText;
   public string InputText { get => inputText set => Set(ref inputText, value); }

   public ICommand ShowDialogCommand {get;}

   public OnShowDialog(object parameter)
   { 
      var childWindowViewModel = container.Resolve<ChildWindowViewModel>(InputText);
      dialogService.ShowWindow(childWindowViewModel);
   }   
}


Пример на WPF c MVVM c библиотекой WpfToolkit

<Application.Resources>
   <DataTemplate DataType="{x:Type MainWindowViewModel} >
      <TextBox Text={Binding InputText}" />
      <Button Command="{Binding ShowDialogCommand}" />

      <wpfToolkit:ChildWindow  Opened="{Binding IsChildDialogOpened}" >
            <TextBlock Text={Binding InputText} /> 
      </wpfToolkit:ChildWindow>

   </DataTemplate>
</Application.Resources>


public class ParentWindowViewModel  : ....
{
   public MyViewModel() 
   {
       .... 
       ShowDialogCommand = new DelegateCommand(OnShowDialog);
   }

   private string inputText;
   public string InputText { get => inputText set => Set(ref inputText, value); }

   private bool isChildDialogOpened;
   public bool IsChildDialogOpened{ get => isChildDialogOpenedset => Set(ref isChildDialogOpened, value); }


   public ICommand ShowDialogCommand {get;}

   public OnShowDialog(object parameter)
   { 
      IsChildDialogOpened= true;
   }   
}



И в итоге опять спрашивается нафига еще одна сущность в виде библиотеки с именем Prism, может там это как-то красивее решается чем в примере из документации (https://prismlibrary.com/docs/wpf/dialog-service.html) ?