powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF: как связать бизнес-объект и UI валидацию?
10 сообщений из 10, страница 1 из 1
WPF: как связать бизнес-объект и UI валидацию?
    #36845084
Есть бизнес-объект, реализующий интерфейс IDataErrorInfo.
В setters публичных свойств объекта при выходе значения за допустимые границы добавляется ошибка в словарь. Например, если свойство Age (по умолчанию 0) становится отрицательным, выдается сообщение об ошибке.

Также у объекта есть readonly свойство bool IsObjectDataValid. При добавлении ошибки в словарь это свойство сбрасывется в false, а при очистке словаря - в true. Смысл этого свойства - например, его привязка к кнопке "Сохранить". Т.е. до тех пор, пока юзер не ввел логически корректные данные во все свойства бизнес-объекта, программа не даст сохранить объект.

Всё это работает, НО...

Если юзер ввел вместо числа строку ("moron"), то свойство остается в предыдущем состоянии, а обработка setter не вызывается, так как ошибка произошла в момент попытки приведения типа. Следовательно, имеем старое значение Age, IsObjectDataValid = true, и кнопка "Сохранить" доступна. На красный бордюр вокруг элемента юзер плюет с высокой башни.

Внимание, вопрос.
Как передать ошибку UI в связанный бизнес-объект?
Как при "кривом" вводе установить IsObjectDataValid = false?
...
Рейтинг: 0 / 0
WPF: как связать бизнес-объект и UI валидацию?
    #36845106
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Александров,

погодь, а код ты показывать , как у тебя интерфейс связан с твоим классом не хочешь?
...
Рейтинг: 0 / 0
WPF: как связать бизнес-объект и UI валидацию?
    #36845149
Через XAML

<TextBox
Width="200"
Text="{Binding Path=Age, Mode=TwoWay,
ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}"
/>

Ничего необычного
...
Рейтинг: 0 / 0
WPF: как связать бизнес-объект и UI валидацию?
    #36845819
Точнее, так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
<Grid x:Name="LayoutGrid">
...
        <TextBox 
            Text="{Binding Path=Age, Mode=TwoWay, 
                ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}"
            />


а в code-behind:
Код: plaintext
1.
2.
3.
4.
5.
6.
private Window_Load()
{
 MyObj obj = new MyObj();
 LayoutGrid.DataContext = obj; 
}

...
Рейтинг: 0 / 0
WPF: как связать бизнес-объект и UI валидацию?
    #36847001
koJIo6ok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Александров,

у вас как то все неправильно организовано
в книжке Макдональдса Pro WPF in C#2008 хорошо написано про то вам надо
так как ошибка произошла в момент попытки приведения типа - это смотреть ValidatesOnExceptions
да и для кнопки лучше использовать routetcomand для этих целей
и проверка на ошибки можно так
Код: plaintext
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.
private bool IsValidationErorr(FrameworkElement el)
        {            
            bool _value = false;

            if (el != null)
            {
                foreach (object child in LogicalTreeHelper.GetChildren(el))
                {
                    FrameworkElement elm = child as FrameworkElement;
                    if (elm != null)
                    {
                        if (Validation.GetHasError(elm))
                        {
                            _value = true;
                        }
                    }
                    if (IsValidationErorr(elm))
                    {
                        _value = true;
                    }
                }
            }

            return _value;
        }
...
Рейтинг: 0 / 0
WPF: как связать бизнес-объект и UI валидацию?
    #36847035
koJIo6ok,

у меня еще ничего не организовано, я только прикидываю - что, как.

Если я правильно понял, то ваш код лежит на форме (или чем-то подобном).
Получается, для того, чтобы сделать кнопку доступной, мне надо проверять валидность как на уровне формы (ваш код), так и на уровне моего бизнес-объекта. А вот это мне и не нравиться.

Можно ли перенаправить обработчик ошибок приведения забинденного контрола на метод бизнес-объекта? Например, я делаю в БО специальный public-method SetUIError(string), и натравливаю обработчик ошибок TextBox на него?
...
Рейтинг: 0 / 0
WPF: как связать бизнес-объект и UI валидацию?
    #36847061
koJIo6ok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий АлександровkoJIo6ok,

у меня еще ничего не организовано, я только прикидываю - что, как.

Если я правильно понял, то ваш код лежит на форме (или чем-то подобном).
Получается, для того, чтобы сделать кнопку доступной, мне надо проверять валидность как на уровне формы (ваш код), так и на уровне моего бизнес-объекта. А вот это мне и не нравиться.

ничего вы не поняли
...
Рейтинг: 0 / 0
WPF: как связать бизнес-объект и UI валидацию?
    #36847174
ничего вы не поняли


Спасибо за информативный ответ
...
Рейтинг: 0 / 0
WPF: как связать бизнес-объект и UI валидацию?
    #36847253
koJIo6ok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий АлександровkoJIo6ok,

у меня еще ничего не организовано, я только прикидываю - что, как.

Если я правильно понял, то ваш код лежит на форме (или чем-то подобном).
Получается, для того, чтобы сделать кнопку доступной, мне надо проверять валидность как на уровне формы (ваш код), так и на уровне моего бизнес-объекта. А вот это мне и не нравиться.

Можно ли перенаправить обработчик ошибок приведения забинденного контрола на метод бизнес-объекта? Например, я делаю в БО специальный public-method SetUIError(string), и натравливаю обработчик ошибок TextBox на него?
нет проверять валидность нужно только на уровне нужного элемента - textbox-a, Grid-a, панели какой ну или для всей формы как надо вам, легко можно разобраться если прочитать книжку ту что я писал, лучше ее почитать сначала чтобы не переделывать потом все и не тратить время впустую
...
Рейтинг: 0 / 0
WPF: как связать бизнес-объект и UI валидацию?
    #36847358
нет проверять валидность нужно только на уровне нужного элемента - textbox-a, Grid-a, панели какой ну или для всей формы как надо вам, легко можно разобраться если прочитать книжку ту что я писал, лучше ее почитать сначала чтобы не переделывать потом все и не тратить время впустую


За книжку спасибо, уже нашел, читаю.

Пока не дочитал до нужного места, подскажите следующее. БО предполагается использовать с несколькими интерфейсами: WPF для внутренних юзеров и Silverlight для внешних. А это значит, что проверки придется дублировать в разных интерфейсах? Не то чтобы сильно пугало (функциональность в приложении Silverlight предполагается сильно урезанная), но как-то это...
Не комильфо.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF: как связать бизнес-объект и UI валидацию?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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