Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.238.62.124] |
|
Сообщ.
#1
,
|
|
|
Подскажите кто как начинает проект MVVM, только не предлагать на основе фрейм ворков или из NuGet, а чисто свой каркас ,
и вопрос больше в том , чего не хватает в этом , пытаюсь собрать минимальную конструкцию что бы можно было потом когда начинаю новый проект скопировал эту папку проекта, так сказать заготовку, запустил и делай новый проект, [Spoiler] 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 Кбайт, скачиваний: 562) |
Сообщ.
#2
,
|
|
|
использую такую модификацию:
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)); } } } дальше удобнее использовать: NotifyPropertyChanged(()=> this.LstWorkers); после this. контрл пробел нажимаю, и выбираю среди членов класса нужный элемент. вместо OnPropertyChanged("LstWorkers") |
Сообщ.
#3
,
|
|
|
Koss ОК , спасибо за подсказку, как раз хотел попробывать , у меня стоит VS2010 и VS2017 так вот в VS2017 сама предлагает , а VS2010 почему то не хочет работать с этой конструкцией.
Подскажите еще как приклеить что то такое универсально-понятное обработку событий и команд , в разных шаблонах вижу что добавляют к проекту папку Commands, посоветуйте как лучше сделать |
Сообщ.
#4
,
|
|
|
Command.cs
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); } } } } |
Сообщ.
#5
,
|
|
|
Koss , большое спасибо , я так понимаю надо добавить к проекту папку Commands и в ней создать этот файл с таким классом , я правильно понял ?
если не трудно подскажите как это работает применительно к моему каркасу, тоесть я например хочу кинуть на форму пару кнопок и обрабатывать естественно их нее Click , ну и еще пару событий формы (т.е. как правильно сказать не событий а команды) |
Сообщ.
#6
,
|
|
|
Цитата kms @ Koss , большое спасибо , я так понимаю надо добавить к проекту папку Commands и в ней создать этот файл с таким классом , я правильно понял ? можно и так. Добавлено Я бы в отдельную папку кидал вместе с ViewModelBase. |
Сообщ.
#7
,
|
|
|
Цитата Koss @ Я бы в отдельную папку кидал вместе с ViewModelBase. у меня ViewModelBase в папке ViewModel , не я лучше для наглядности отдельно для команд папку сделаю |
Сообщ.
#8
,
|
|
|
Цитата kms @ не я лучше для наглядности отдельно для команд папку сделаю можешь в неё складывать partail'ы классов с коммандами, чтоб не запутаться, где у тебя обработчики событий, а где остальная вьюмодель. |
Сообщ.
#9
,
|
|
|
ОК , делаю
Цитата Koss @ где у тебя обработчики событий, подскажите еще вот такое , с обработчиками не могу разрулить , как мне сделать чтобы было что то универсальное , я хочу прямо в файлах написать коменты куда что вставлять , так было в старой VisualStudio и в BulderBorland где то в году 2002 , там такой нюанс мне нравился , при создании нового проекта во всех сгенерированых файлах были вставленны такие заготовки классов, функций, обработчики, переменные , и все было подписано комментариями куда что всятавлять и что дописывать , очень удобно было , правда все на буржуйском языке , но через пару дней привыкал , вот такое я и хачу повторить для C# WPF MVVM вот такие дела , вообщем помогите с расписать события команды обработку событий |