Есть окно, у которого в DataContext записана ViewModel. Внутри окна есть UserControl в ресурсах которого описаны несколько шаблонов отображения данных - DataTemplate. В каждом шаблоне есть TexBox-ы текст которых я привязываю к некоторому свойству во ViewModel.
<TextBox Text="{Binding DataContext.PropertyName, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}"/>
Все вроде бы хорошо, но мне нужно добавить валидацию вводимых данных. Делаю так:
<TextBox Margin="15,0,15,0" Style="{DynamicResource TextStyle}">
<TextBox.Text>
<Binding
Path="PropertyName"
RelativeSource="{RelativeSource Mode=FindAncestor,
AncestorType=Window}">
<Binding.ValidationRules>
<DataErrorValidationRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
И дизайнер студии выдает ошибку "Не удалось найти свойство "PropertyName" в типе "String"". В общем проблема такова: я не могу "привязаться" к свойству ViewModel при использовании валидации данных. Прошу подсказать как это можно реализовать. Спасибо!
<TextBox Text = "{Binding ...}">. Так почему вы тогда гвоздями приколачиваете данные к контрлам? – EvgeniyZ Mar 06 '22 at 09:25А почему у вас UserControl вообще знает что-либо про какие-то там данные? Вроде вполне конкретный вопрос, даже пример сTextBoxпривел. Ну ок, давайте по другому пойдем... Вот вы пишетеВнутри окна есть UserControl в ресурсах которого описаны несколько шаблонов отображения данных, то есть, у вас есть собственный контол, со своим видом, дальше вы пишете где-то так<uc:MyUserControl/>, а должны писать так<uc:MyUserControl Text = "{Binding Text}"/>. Разницу заметили? В первом варианте у вас все привязки заданы внутри стиля, то есть контрол заточен под одну задачу. – EvgeniyZ Mar 06 '22 at 10:29<uc:MyUserControl Text = "{Binding Name}"/>). Также и валидация, не везде она нужна, что, будете пилить к каждому свойству, валидации свой отдельный стиль? – EvgeniyZ Mar 06 '22 at 10:34RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=Window}"(поиск родителя) - у вас этого не должно быть, ибо каждая страница должна иметь свою VM. – EvgeniyZ Mar 06 '22 at 10:49А в чем проблема использовать команды по нажатию кнопки для переключения UC- как? Пример можете предоставить? – EvgeniyZ Mar 06 '22 at 11:26UC_3- это контрол, то есть View слой, а значит, ViewModel вообще не должен про него что-либо знать. Это равноценноnew MainWindow().Show();- тоже нарушение MVVM, ибо напрямую инициализируем и вызываем окно в VM слое. Ваш проект, при использовании MVVM подхода, должен базироваться на абстракциях, интерфейсах, все с минимальной связью. Другими словами, должно быть так, чтоб если вы удалитеUC_3(View слой), ваш проект запускался бы и работал, но без интерфейса. То есть логика других слоев не должна страдать из-за этого. – EvgeniyZ Mar 06 '22 at 11:44= new UC_3, а= new SettingPageVM();), тем самым вы отделите View от ViewModel слоя. А так, я вам советую стремиться к подобному, там можете заметить, что все вовсе разбито по отдельным проектам, с минимальной связью. – EvgeniyZ Mar 06 '22 at 11:50