powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / mvvm концепция
12 сообщений из 12, страница 1 из 1
mvvm концепция
    #39808016
kill_zdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
потихоньку вроде воткнул, но часть вопросов висит )
Можно ли замутить (у меня пока эйфория от C# и тех плюшек которые пропустил - --- голова кругом ))) не обращайте вним ))) )
Сейчас наверное спрошу полную фигню, готов к осуждению ))
Хочу уйти от много-повторяющихся движух.
Допустим у меня есть класс, который тянется от Entity, есть контекст данных, есть вьюшка и есть вьюмодель. Вьюшка дернет ICommand скажем на добавление, который дернет конкретную реализацию во вьюмодель, скажем addCommand. Замечательно, это работает, но хочется еще более универсилизировать, а мозгов видимо не хватает... спишем на усталось ну или на возраст на крайняк )))
Вопросов два
1. Подумалось форму редактор прилепить в виде свойства или что то в этом духе, но думается не правильно
2. Просто в команде уже вызывать форму редактор, но то же ..как то.....

Как правильно друзья подскажите, отвязавшись от модели и представления привязать форму редактирования , которая будет жить в контексте и которой этот контекст можно передать

p.s. Прежде чем лезть к Вам с вопросами, нашел предварительные реализации, реализовал, но что то смущает и что то не нравится.
...
Рейтинг: 0 / 0
mvvm концепция
    #39808090
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kill_zdmреализовалпоказывай.
Но общее правило - не надо в первом своем коде "универсализировать".
MVVM не догма.
Не беги так быстро).
...
Рейтинг: 0 / 0
mvvm концепция
    #39808127
kill_zdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123kill_zdmреализовалпоказывай.
Но общее правило - не надо в первом своем коде "универсализировать".
MVVM не догма.
Не беги так быстро).
Только не смейтесь, я только учусь и с каталогами еще перемутил, потом подправлю :)
Хотя нет, смейтесь и ругайте где что не так это будет полезнее ))

1. Вьюшка Properties.xaml

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"            
             x:Class="Trade4.Pages.Dictonary.View.Properties"
             xmlns:tp="clr-namespace:Trade4.Components"
             xmlns:vm="clr-namespace:Trade4.Pages.Dictonary.ViewModel"          
             mc:Ignorable="d">
    <UserControl.DataContext>
        <vm:PropertiesModel />
    </UserControl.DataContext>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />            
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <tp:TopPanel x:Name="tPanel"
                     Grid.Column="2"
                     Sender="Product" />        
        <DataGrid Grid.Row="1"
                  HorizontalAlignment="Left"
                  Width="400"
                  Grid.Column="2"
                  ItemsSource="{Binding  PropertiesView}"
                  Name="grid1"
                  AutoGenerateColumns="False"
                  IsReadOnly="True"
                  CanUserResizeColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Наименование"
                                    Width="400"
                                    Binding="{Binding Path=Name}">                    
                </DataGridTextColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</UserControl>



внедрен tp:TopPanel ну пока на что ума хватило, это юзерконтрол с пимпами, пока две команды добавить и редактировать
2. TopPanel.xaml
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
<UserControl x:Class="Trade4.Components.TopPanel"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"          
             mc:Ignorable="d"
             Loaded="OnLoad">
    <Grid Margin="5">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>
       
        <Button x:Name="btnAdd"
                Command="{Binding AddCommand}"
                HorizontalAlignment="Center"
                Grid.Column="0"
                Padding="1"
                Margin="3,0,0,0">
            <StackPanel Orientation="Horizontal">
                <Image Source="/Images/Add.png"
                       Margin="0,0,5,0" />
                <TextBlock Text="Создать" VerticalAlignment="Center" Padding="0,0,5,0"/>
            </StackPanel>
        </Button>
        <Button x:Name="btnEdit"
                Command="{Binding EditCommand}"
                HorizontalAlignment="Center"
                Grid.Column="1"
                Padding="1"
                Margin="3,0,0,0">
            <StackPanel Orientation="Horizontal">
                <Image Source="/Images/Edit.png"
                       Margin="0,0,5,0" />
            
            </StackPanel>
        </Button>
        
    </Grid>
</UserControl>




3. Модель Properties.cs сгенерированная Entity
using System;
using System.Collections.Generic;

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
namespace Trade4.Models
{
    public partial class Properties
    {
        public Properties()
        {
            PropertiesCategory = new HashSet<PropertiesCategory>();
        }

        public int Id { get; set; }
        public string Name { get; set; }

        public virtual ICollection<PropertiesCategory> PropertiesCategory { get; set; }
    }
}


4. Обобщающий ViewModelBase, по сути пока просто реализующий интерфейс класс INotifyPropertyChanged
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
namespace Trade4.ViewModel {
    class ViewModelBase : INotifyPropertyChanged {
        public event PropertyChangedEventHandler PropertyChanged;
        public void NotifyPropertyChanged([CallerMemberName] String propertyName = "") {
            if (PropertyChanged != null) {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}


5. Еще создал прослойку для ICommand CommandAction.cs по сути пока то же тупо реалзующий без затейлиовсти интерфейс
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
class CommandAction : ICommand
    {
        private Action<object> execute;
        private Func<object, bool> canExecute;

        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }

        public CommandAction(Action<object> execute, Func<object, bool> canExecute = null)
        {
            this.execute = execute;
            this.canExecute = canExecute;
        }

        public bool CanExecute(object parameter)
        {
            return this.canExecute == null || this.canExecute(parameter);
        }

        public void Execute(object parameter)
        {
            this.execute(parameter);
        }
    }



6. PropertiesModel наследуется от ViewModelBase , вьюшка Properties.xaml которого дернет команды.
class PropertiesModel : ViewModelBase {
dbContext ctx = new dbContext();
public PropertiesModel() {
Properties = ctx.Properties.ToList();
PropertiesView = new ListCollectionView(Properties);
PropertiesView.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));
}
public ListCollectionView PropertiesView { get; }
private List<Properties> _properties;
public List<Properties> Properties {
get => _properties;
set {
_properties = value;
NotifyPropertyChanged();
}
}
private CommandAction addCommand;
public CommandAction AddCommand {
get {
return addCommand ??
(addCommand = new CommandAction(obj => {
ctx.SaveChanges();
InsUpd(true);
}));
}
}
private CommandAction editCommand;
public CommandAction EditCommand {
get {
return editCommand ??
(editCommand = new CommandAction(obj => {
InsUpd(false);
}));
}
}
private void InsUpd(bool isNew) {
Properties prop = (isNew == true) ? new Properties() : (PropertiesView.CurrentItem as Properties);
ModernDialog edit = new PropertyEdit();
edit.DataContext = prop;
ctx.Properties.Attach(prop);
edit.ShowDialog();
if (edit.DialogResult == true) {
ctx.SaveChanges();
if (isNew == true) Properties.Add(prop);
PropertiesView.Refresh();
if (isNew == true) PropertiesView.MoveCurrentTo(prop);
}
}

}


Воот, но тут я конкретно указал дернуть ModernDialog edit = new PropertyEdit(); не обращайте вним, тут может быть любая из форм, пока просто игрался с Modern UI параллельно, так вот, механизм то в целом будет всегда похожий и вот как бы это универсилизировать, т.е. по факту ..может глупость конечно, что то типа
1. Опеределить obj по имени на входе команды
2. Соблюдя именованность в проекте,..скажем пришло , что то с именем Property значит найди Property+"Edit" , а так же еще и пихни каким то образом склееный варик (PropertiesView.CurrentItem as Properties)


что то я загнался походу ))))) хотя ))) что то похожее в дэлфи я реализовывал ))
...
Рейтинг: 0 / 0
mvvm концепция
    #39808135
kill_zdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
6. забыл обрамить в код
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
class PropertiesModel : ViewModelBase {
        dbContext ctx = new dbContext();
        public PropertiesModel() {
            Properties = ctx.Properties.ToList();
            PropertiesView = new ListCollectionView(Properties);
            PropertiesView.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));
        }
        public ListCollectionView PropertiesView { get; }
        private List<Properties> _properties;
        public List<Properties> Properties {
            get => _properties;
            set {
                _properties = value;
                NotifyPropertyChanged();
            }
        }
        private CommandAction addCommand;
        public CommandAction AddCommand {
            get {
                return addCommand ??
                  (addCommand = new CommandAction(obj => {                    
                      ctx.SaveChanges();
                      InsUpd(true);
                  }));
            }
        }
        private CommandAction editCommand;
        public CommandAction EditCommand {
            get {
                return editCommand ??
                  (editCommand = new CommandAction(obj => {
                      InsUpd(false);
                  }));
            }
        }
        private void InsUpd(bool isNew) {
            Properties prop = (isNew == true) ? new Properties() : (PropertiesView.CurrentItem as Properties);
            ModernDialog edit = new PropertyEdit();
            edit.DataContext = prop;
            ctx.Properties.Attach(prop);
            edit.ShowDialog();
            if (edit.DialogResult == true) {
                ctx.SaveChanges();
                if (isNew == true) Properties.Add(prop);
                PropertiesView.Refresh();
                if (isNew == true) PropertiesView.MoveCurrentTo(prop);
            }
        }

    }
...
Рейтинг: 0 / 0
mvvm концепция
    #39808189
kill_zdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ой, забыл еще, там свети Loaded="OnLoad" событие в TopPanel где кнопки, то же пока ни чего умнее не придумал как
public TopPanel()
{
InitializeComponent();
}
void OnLoad(object sender, RoutedEventArgs e)
{
btnAdd.CommandParameter = this.Sender;
btnEdit.CommandParameter = this.Sender;
}

пихнуть параметром команду, т.е. к примеру, у меня есть -справа дерево слева товары, во вьюмодель оба внедрены, сверху у обоих эти кнопки , как мне определить кто вызвал? на скороую руку сделал так,но мне кажется это не правильно

public CommandAction AddCommand {
get {
return addCommand ??
(addCommand = new CommandAction(obj => {
if (obj.Equals("Category")) {
.....
xaml встроенной топпанели которая это дернет
<tp:TopPanel x:Name="tPanelCategory"
Sender="Category" />

может ошибаюсь но как то не по феньшую мне кажется )))))
...
Рейтинг: 0 / 0
mvvm концепция
    #39808211
kill_zdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kill_zdm,

по примеру из своего кода дэлфи, модели обозначаю ее форму редактора, предпологается, что будет вызвана форма с похожем именем + суффиксы и префиксы. И если дернул скажем Propertis то вызовется форма PropertisEdt , либо какая то экслюзивная форма FormEditOver, либо упадет ))))))
...
Рейтинг: 0 / 0
mvvm концепция
    #39808212
kill_zdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
mvvm концепция
    #39808216
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kill_zdm,
Ты говорил у тебя DevExpress был.
Там не надо ничего писать. Все редакторы вызывались по типу колонки или поля проставленному в дизайне.
...
Рейтинг: 0 / 0
mvvm концепция
    #39808223
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kill_zdmголова кругомсделай демку просмотра БЕЗ РЕДАКТИРОВАНИЯ.
Потом второй версией редактирование и в отдельной теме.
...
Рейтинг: 0 / 0
mvvm концепция
    #39808225
kill_zdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Petro123]kill_zdm,
Ты говорил у тебя DevExpress был.



он был и есть, вызывается форма по имени редактора, т.е. вопрос в чем - как найти класс или форму по имени и вызвать ее модально в с# если это возможно?

а что там у меня за юзеринтерфейсы в виде гридов девэкспресс и т.д. в обще ну ни как не важно.
К слову я думал тебя смутит более конструкция объявления переменной на ходу и обвинишь, что это не Delphi ))) с 10.3 мы теперь то же так можем )))

for var I := 0 to Screen.FormCount - 1
...
Рейтинг: 0 / 0
mvvm концепция
    #39808243
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kill_zdm,
Мне не нравится когда катят на дельфи про mdi, а там не пишут такого ооочень давно. Мне не понравилось что в дельфи ищут редакторы, хотя по умолчааниюю их не надо искать..
Вот я высказал удивление.
А по сабжу я сказал. Не делай счас редакттирование.
Компонуй формы, делай пагинацию и вью.
Это имхо..
...
Рейтинг: 0 / 0
mvvm концепция
    #39808252
kill_zdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтоб я, да на delphi катил? ) в любых проявлениях, но вот ты опять зацепился к mdi, я же пояснял и не раз, что имел в виду общее понятие, главная форма с дочками, а уж как реализовать, то и спрашивал + в контексте wpf особенностей
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / mvvm концепция
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]