Технический код в ViewModel в wpf?

У меня есть UserControl с некоторыми настраиваемыми свойствами зависимостей, привязанными к свойству clr в ViewModel. ViewModel имеет логику приложения, в которой я работаю с классами TextPointer/TextRange с помощью FlowDocument.

Должен ли я поместить этот материал в код программной части UserControl или в ViewModel?

ranges.Clear();
            TextRange range = new TextRange(boundXamlDocument.ContentStart, boundXamlDocument.ContentEnd);
            foreach (var block in boundXamlDocument.Blocks)
            {
                if (block is Paragraph)
                {
                    Paragraph p = block as Paragraph;
                    //if paragraph has Strikethrough, then do not loop its inlines.
                    if (p.TextDecorations.Contains(TextDecorations.Strikethrough[0]))
                    {
                        TextRange tr = new TextRange(p.ContentStart, p.ContentEnd);
                        ranges.Add(tr);
                    }
                    else
                    {
                        foreach (var run in p.Inlines)
                        {
                            if (run.TextDecorations.Contains(TextDecorations.Strikethrough[0]))
                            {
                                TextRange tr = new TextRange(run.ContentStart, run.ContentEnd);
                                ranges.Add(tr);
                            }
                        }
                    }
                }
            }

person Bluna    schedule 09.08.2010    source источник


Ответы (1)


Я беспокоюсь о разработке пользовательских/пользовательских элементов управления только тогда, когда у меня есть концепция, которая не вписывается ни в один из обычных элементов управления (редко или никогда), или у меня есть поведение пользовательского элемента управления, которое я хочу повторно использовать (что встречается чаще).

Чем более абстрактным может быть ваш элемент управления, тем более многоразовым он будет. Хотя делать это настолько абстрактным, что никто не получит от этого никакой пользы, было бы слишком много :)

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

Если функция элемента управления не относится к конкретному стилю представления/ввода пользователя и относится к этому экземпляру элемента управления, вам, вероятно, следует поместить ее в модель представления.

Изменить:

Из ваших комментариев кажется, что код, который вы пытаетесь написать, зависит от элементов пользовательского интерфейса (текстовые декораторы TextBlock). Это означает, что он должен и должен идти в представлении.

person Merlyn Morgan-Graham    schedule 09.08.2010
comment
хорошо, судя по вашему ответу, кажется, что код программной части всегда запрещен... Я обновил свой пост инициализации с образцом кода, как он мог бы выглядеть... должен ли я действительно поместить это в свою ViewModel, где я также объявляю свой частный IDocumentRepository _documentRepo = новый DocumentRepository(); _documentRepo.DoStuff(); Это выглядит действительно странно, если объединить логику приложения и материал репозитория в один класс, похоже, что уровень представления и границы доступа к данным размываются... - person Bluna; 09.08.2010
comment
@Bluna: я не знаю, что всегда делать неправильно. Код позади == View. Если это конкретное представление, можно поместить его в код позади, если это не слишком сложно/слишком запутанно для помещения в XAML. - person Merlyn Morgan-Graham; 09.08.2010
comment
ах, ваш пост был 4 секунды назад, когда я добавил свой пример кода: P Я не могу поместить этот код в xaml, так как он не будет работать... - person Bluna; 09.08.2010
comment
@Bluna: мне нравится думать о представлении как о одноразовом коде. Если бы вы хотели представить другое представление в любой момент времени, какой код вы бы оставили? Кажется, что вам всегда нужен этот код if not strikethrough, независимо от представления, поэтому он должен быть в модели представления. - person Merlyn Morgan-Graham; 10.08.2010
comment
с образцом кода я имел в виду, что это не мой код, а образец... ;-) Я думаю, что чем хуже реализован контроль в отношении DepProp, тем сложнее реализовать MVVM. TextDecorations в выбранном тексте можно получить только через textblock.TextDecorations, и я не думаю, что загрязняю свою ViewModel элементами пользовательского интерфейса, такими как textblock... - person Bluna; 10.08.2010
comment
@Bluna: Да, определенно нет элементов пользовательского интерфейса в модели представления. Поскольку это зависит от представления, поместите его в код позади. - person Merlyn Morgan-Graham; 10.08.2010