Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.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 |
у меня ViewModelBase в папке ViewModel , не я лучше для наглядности отдельно для команд папку сделаю |
Автор: Koss 13.07.18, 09:48 |
можешь в неё складывать partail'ы классов с коммандами, чтоб не запутаться, где у тебя обработчики событий, а где остальная вьюмодель. |
Автор: kms 13.07.18, 22:49 |
ОК , делаю подскажите еще вот такое , с обработчиками не могу разрулить , как мне сделать чтобы было что то универсальное , я хочу прямо в файлах написать коменты куда что вставлять , так было в старой VisualStudio и в BulderBorland где то в году 2002 , там такой нюанс мне нравился , при создании нового проекта во всех сгенерированых файлах были вставленны такие заготовки классов, функций, обработчики, переменные , и все было подписано комментариями куда что всятавлять и что дописывать , очень удобно было , правда все на буржуйском языке , но через пару дней привыкал , вот такое я и хачу повторить для C# WPF MVVM вот такие дела , вообщем помогите с расписать события команды обработку событий |