У меня есть свойство зависимости в ViewModel, которое является DataContext для моего View.ViewModel не имеет ссылки на View.Свойство ViewModel будет ссылаться на элемент управления в представлении, но мне нужно иметь возможность установить это свойство в XAML.
Как это возможно?Одна мысль, которая у меня была, заключалась в разработке пользовательского элемента управления, который имеет свойство Property и свойство Value, чтобы вы могли сделать что-то подобное в View, чтобы установить свойство в ViewModel:
<PropertySetter Property="{Binding MyViewModelDependencyProperty}" Value="{Binding ElementName=aControlOnMyView" />
До того, как я ушелвниз по этому маршруту, я хотел проверить, есть ли другой подход, который я мог бы предпринять?
Спасибо за подробный ответ, Рэй, но если я дам вам немного больше информации о проблеме, которую я пытаюсьЧтобы решить, вы можете лучше понять, почему я упомянул подход, который я использовал.
По сути, я пытаюсь установить фокус на текстовом поле, когда пользователь нажимает кнопку.Я написал прикрепленное свойство, которое вы можете прикрепить к элементу управления Button, указать, что такое событие триггера (в данном случае событие «Click»), а затем на каком элементе управления сосредоточиться.Это работает очень хорошо и сохраняет все в XAML.
Однако теперь у меня есть случай использования, когда фокус должен быть установлен на произвольное текстовое поле из события click на кнопке, которая является частью панели инструментов.Эта панель инструментов сама по себе является пользовательским элементом управления, который находится внутри другого пользовательского элемента управления, который находится внутри другого пользовательского элемента управления!Эту панель инструментов необходимо многократно использовать в различных формах, и каждый раз элемент управления, на который нужно фокусироваться после нажатия кнопки, будет отличаться для каждой формы.
Вот почему у меня возникла идея сделать элемент управления фокусом (т. Е. Текстовое поле) свойством самой модели представления (точнее, моей базы ViewModel) и иметь базовый код ViewModel (которым является панель инструментов).привязан к), установите фокус на элемент управления при нажатии кнопки (и, например, метод Add / Edit вызывается на базе ViewModel).
В модульном тестовом поле элемент управления, на котором следует сосредоточиться на свойстве, будетnull, так что метод .Focus () просто не будет вызываться.Так что я не вижу проблемы там.Моя проблема заключается в том, как вы устанавливаете свойство элемента управления фокусом из XAML, поэтому у меня возникла идея PropertySetter.
Мне не нравится тот факт, что ViewModel имеет какую-либо ссылку на элементы управления, сидящие в представлении, ноЯ не вижу другого способа добиться того, что мне нужно.Что, если логика, которая диктует, нужно ли фокусироваться на элементе управления, довольно сложна?Это будет сидеть во ViewModel, конечно?Следовательно, есть ли вред во ViewModel, имеющем это свойство UIElement?Он по-прежнему ничего не знает о конкретном представлении, с которым он связан, он просто знает, что существует элемент управления, на который необходимо установить фокус, когда какое-либо действие происходит в ViewModel.