2015-05-05 4 views
0

Обновление: Я занимаюсь решением проблемы, и я не совсем уверен, можем ли мы это сделать. Я буду обновлять этот вопрос, как только у меня есть лучшее понимание того, что я хочу :-)Общая логика проверки по двум различным моделям


Наш текущий проект использует WPF вместе с подходом MVVM. Наше приложение будет иметь несколько редакторов, каждый со своей собственной моделью.

мнение будет выглядеть следующим образом:

Overview

Каждый редактор имеет свою собственную модель/ViewModel/модель. Модель родительского представления (которая содержит все подредакторы) содержит данные, из которых могут быть загружены все подредакторы.

Поскольку пользователь должен иметь возможность сохранять текущее состояние в любое время, нам также нужно иметь возможность проверять существующие данные (поскольку пользователь мог ввести неверные данные). Таким образом, нам нужно подтверждение в двух местах:

  • , когда пользователь вводит данные
  • , когда данные загружаются снова после запуска приложения

Поскольку мы не хотим, чтобы преобразовать данные в каждый Sub Editor, чтобы получить результат проверки, родительская модель также должна быть проверена.

Единственный способ, которым я нашел для этого, - представить интерфейсы, которые в основном описывают структуру данных внутри класса, который должен быть проверен. Это может выглядеть так:

interface IValidateModel 
{ 
    string foo; 
} 

class Editor1Model : IValidateModel 
{ 
    string foo; 
    int someOtherProperty; 
} 

class Editor2Model: IValidateModel 
{ 
    string foo; 
    byte fooBar;  
} 

class ParentModel 
{ 
    Sub subProp; 
    // some other parent model properties 
} 

Недостатком является то, что теперь способ структурирования данных определяется интерфейсом.

У кого-нибудь есть опыт работы с этой проблемой или даже есть лучшее решение для этого?

+0

Я не владею английским языком, поэтому, возможно, именно поэтому я не могу полностью понять ваш вопрос. Можете ли вы разместить более конкретный/фактический пример/код, пожалуйста? –

+0

Как вы проводите проверку? – Domysee

+0

Интерфейс, который вы называете 'IValidateModel', уже существует в WPF и называется' IDataErrorInfo'. Используя его, вы можете делегировать валидацию модели (независимо от того, сколько у вас ViewModels). Вы можете прочитать хороший [учебник здесь о codeproject] (http://www.codeproject.com/Tips/784331/WPF-MVVM-Validation-ViewModel-using-IDataErrorInfo) о проверке 'IDataErrorInfo'.Возможно, он может быть подходящим для вашего проекта. –

ответ

0

Если вы хотите подтвердить ввод пользователя, тогда вы должны использовать ValidationRules на креплениях.

Вы определяете их наследование от ValidationRule и перезаписи Validate():

public class TestRule : ValidationRule 
{ 
    public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
    { 
     string test = value as string; 

     if (text == null) 
     { 
      return new ValidationResult(false, "only strings are allowed"); 
     } 
     else 
     { 
      return new ValidationResult(true, null); 
     } 
    } 
} 

В XAML можно указать пространство имен правил проверки:

<Window xmlns:vr="clr-namespace:MyApp.ValidationRules"></Window> 

И тогда вы можете использовать его на переплетах, как это :

<TextBox> 
    <TextBox.Text> 
     <Binding Path="MyPath"> 
      <Binding.ValidationRules> 
       <vr:TestRule /> 
      </Binding.ValidationRules> 
     </Binding> 
    </TextBox.Text> 
</TextBox> 
Смежные вопросы