На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Модераторы: maxim84_, juice
  
> C# WPF MVVM стартовый шаблон проекта, Минимальный каркас, без сторонних фреймворков
    Подскажите кто как начинает проект MVVM, только не предлагать на основе фрейм ворков или из NuGet, а чисто свой каркас ,
    и вопрос больше в том , чего не хватает в этом , пытаюсь собрать минимальную конструкцию что бы можно было потом когда начинаю новый проект скопировал эту папку проекта, так сказать заготовку, запустил и делай новый проект,

    [Spoiler]
    ExpandedWrap disabled
      App.xaml.cs
       
      using System.Windows;
       
      using SkeletMVVM.View;
      using SkeletMVVM.ViewModel;
       
      namespace SkeletMVVM
      {
          public partial class App : Application
          {
       
              private void OnStartup(object sender, StartupEventArgs e)
              {
                  MainWindow view = new  MainWindow(); // создали View
                  MainViewModel viewModel = new ViewModel.MainViewModel(); // Создали ViewModel
                  view.DataContext = viewModel; // положили ViewModel во View в качестве DataContext
                  view.Show();
              }
       
          }
      }
       
       
      App.xaml
       
      <Application x:Class="SkeletMVVM.App"
                   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                   Startup="OnStartup">
          
          <Application.Resources>
              
          </Application.Resources>
          
      </Application>
       
       
      MainViewModel.cs
       
      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
       
      namespace SkeletMVVM.ViewModel
      {
          class MainViewModel:BaseViewModel
          {
            
          }
      }
       
       
      BaseViewModel.cs
       
      using System;
      using System.Collections.Generic;
      using System.ComponentModel;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
       
      namespace SkeletMVVM.ViewModel
      {
          public abstract class BaseViewModel : INotifyPropertyChanged
          {
              public event PropertyChangedEventHandler PropertyChanged;
       
              protected void OnPropertyChanged(string propertyName)
              {
                  PropertyChangedEventHandler handler = PropertyChanged;
       
                  if (handler != null)
                  {
                      handler(this, new PropertyChangedEventArgs(propertyName));
                  }
              }
       
          }
      }
       
       
      MainWindow.xaml.cs
       
      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      using System.Windows;
      using System.Windows.Controls;
      using System.Windows.Data;
      using System.Windows.Documents;
      using System.Windows.Input;
      using System.Windows.Media;
      using System.Windows.Media.Imaging;
      using System.Windows.Shapes;
       
      namespace SkeletMVVM.View
      {
          /// <summary>
          /// Логика взаимодействия для MainWindow.xaml
          /// </summary>
          public partial class MainWindow : Window
          {
              public MainWindow()
              {
                  InitializeComponent();
              }
              
          }
      }
       
       
      MainWindow.xaml
       
      <Window x:Class="SkeletMVVM.View.MainWindow"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              Title="MainWindow" Height="300" Width="300">
          <Grid/>
      </Window>
       
       
      ClassModel.cs
       
      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
       
      namespace SkeletMVVM.Model
      {
          class ClassModel
          {
       
       
              public ClassModel()
              {
              }
       
          }
      }

    [/Spoler]
    Прикреплённый файлПрикреплённый файлpro3.png (22,39 Кбайт, скачиваний: 55)
      использую такую модификацию:

      ExpandedWrap disabled
            public abstract class ViewModelBase : INotifyPropertyChanged
            {
                public event PropertyChangedEventHandler PropertyChanged;
         
                public void NotifyPropertyChanged<T>(Expression<Func<T>> property)
                {
                    if (PropertyChanged != null)
                    {
                        var memberExpression = property.Body as MemberExpression;
         
                        PropertyChanged(this, new PropertyChangedEventArgs(memberExpression.Member.Name));
                    }
                }
            }


      дальше удобнее использовать:
      ExpandedWrap disabled
        NotifyPropertyChanged(()=> this.LstWorkers);

      после this. контрл пробел нажимаю, и выбираю среди членов класса нужный элемент.
      вместо
      ExpandedWrap disabled
        OnPropertyChanged("LstWorkers")
        Koss ОК , спасибо за подсказку, как раз хотел попробывать , у меня стоит VS2010 и VS2017 так вот в VS2017 сама предлагает , а VS2010 почему то не хочет работать с этой конструкцией.

        Подскажите еще как приклеить что то такое универсально-понятное обработку событий и команд , в разных шаблонах вижу что добавляют к проекту папку Commands, посоветуйте как лучше сделать
          Command.cs

          ExpandedWrap disabled
            using System;
            using System.Collections.Generic;
            using System.Linq;
            using System.Text;
            using System.Windows.Input;
             
            namespace Test.ViewModel
            {
                public class Command : ICommand
                {
                    public Command(Action<object> action)
                    {
             
                        ExecuteDelegate = action;
                    }
             
                    public Predicate<object> CanExecuteDelegate { get; set; }
             
                    public Action<object> ExecuteDelegate { get; set; }
             
                    public bool CanExecute(object parameter)
                    {
                        if (CanExecuteDelegate != null)
                        {
                            return CanExecuteDelegate(parameter);
                        }
             
                        return true;
                    }
             
                    public event EventHandler CanExecuteChanged
                    {
                        add { CommandManager.RequerySuggested += value; }
                        remove { CommandManager.RequerySuggested -= value; }
                    }
             
                    public void Execute(object parameter)
                    {
                        if (ExecuteDelegate != null)
                        {
                            ExecuteDelegate(parameter);
                        }
                    }
                }
            }
            Koss , большое спасибо , я так понимаю надо добавить к проекту папку Commands и в ней создать этот файл с таким классом , я правильно понял ?

            если не трудно подскажите как это работает применительно к моему каркасу, тоесть я например хочу кинуть на форму пару кнопок и обрабатывать естественно их нее Click , ну и еще пару событий формы (т.е. как правильно сказать не событий а команды)
              Цитата kms @
              Koss , большое спасибо , я так понимаю надо добавить к проекту папку Commands и в ней создать этот файл с таким классом , я правильно понял ?

              можно и так.

              Добавлено
              Я бы в отдельную папку кидал вместе с ViewModelBase.
                Цитата Koss @
                Я бы в отдельную папку кидал вместе с ViewModelBase.


                у меня ViewModelBase в папке ViewModel , не я лучше для наглядности отдельно для команд папку сделаю
                  Цитата kms @
                  не я лучше для наглядности отдельно для команд папку сделаю

                  можешь в неё складывать partail'ы классов с коммандами, чтоб не запутаться, где у тебя обработчики событий, а где остальная вьюмодель.
                    ОК , делаю
                    Цитата Koss @
                    где у тебя обработчики событий,

                    подскажите еще вот такое , с обработчиками не могу разрулить , как мне сделать чтобы было что то универсальное ,

                    я хочу прямо в файлах написать коменты куда что вставлять , так было в старой VisualStudio и в BulderBorland где то в году 2002 , там такой нюанс мне нравился , при создании нового проекта во всех сгенерированых файлах были вставленны такие заготовки классов, функций, обработчики, переменные , и все было подписано комментариями куда что всятавлять и что дописывать ,

                    очень удобно было , правда все на буржуйском языке , но через пару дней привыкал , вот такое я и хачу повторить для C# WPF MVVM

                    вот такие дела , вообщем помогите с расписать события команды обработку событий
                    1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script Execution time: 0,1049 ]   [ 17 queries used ]   [ Generated: 17.10.18, 10:14 GMT ]