Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > .NET: Общие вопросы > C# WPF MVVM стартовый шаблон проекта


Автор: kms 11.07.18, 02:30
Подскажите кто как начинает проект MVVM, только не предлагать на основе фрейм ворков или из NuGet, а чисто свой каркас ,
и вопрос больше в том , чего не хватает в этом , пытаюсь собрать минимальную конструкцию что бы можно было потом когда начинаю новый проект скопировал эту папку проекта, так сказать заготовку, запустил и делай новый проект,

[Spoiler]
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    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 (, : 562)

Автор: Koss 12.07.18, 06:12
использую такую модификацию:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
        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));
                }
            }
        }


дальше удобнее использовать:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    NotifyPropertyChanged(()=> this.LstWorkers);

после this. контрл пробел нажимаю, и выбираю среди членов класса нужный элемент.
вместо
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    OnPropertyChanged("LstWorkers")

Автор: kms 12.07.18, 08:20
Koss ОК , спасибо за подсказку, как раз хотел попробывать , у меня стоит VS2010 и VS2017 так вот в VS2017 сама предлагает , а VS2010 почему то не хочет работать с этой конструкцией.

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

Автор: Koss 12.07.18, 12:48
Command.cs

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    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);
                }
            }
        }
    }

Автор: kms 12.07.18, 19:11
Koss , большое спасибо , я так понимаю надо добавить к проекту папку Commands и в ней создать этот файл с таким классом , я правильно понял ?

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

Автор: Koss 13.07.18, 06:23
Цитата kms @
Koss , большое спасибо , я так понимаю надо добавить к проекту папку Commands и в ней создать этот файл с таким классом , я правильно понял ?

можно и так.

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

Автор: kms 13.07.18, 08:57
Цитата Koss @
Я бы в отдельную папку кидал вместе с ViewModelBase.


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

Автор: Koss 13.07.18, 09:48
Цитата kms @
не я лучше для наглядности отдельно для команд папку сделаю

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

Автор: kms 13.07.18, 22:49
ОК , делаю
Цитата Koss @
где у тебя обработчики событий,

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

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

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

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

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)