Доступ ваших компонентов Вид изнутри вашего ViewModel не способ делать вещи в MVVM. Поскольку он специально не предназначен для работы таким образом, вам придется уйти с дороги, чтобы заставить его работать. Вероятно, вам следует исследовать, как правильно выполнять свои цели с использованием MVVM, или вообще отказаться от использования MVVM и выполнять работу в коде.
Поскольку вы не указали, какова ваша цель, трудно дать конкретные рекомендации. В общем, при использовании MVVM вы управляете вещами в своей модели viewmodel и задаете свойства. Ваше представление привязывается к этим свойствам, чтобы оно соответствующим образом обновлялось по мере их установки. Ваша viewmodel напрямую не манипулирует самими представлениями, а только свойствами viewmodel, к которым они привязаны.
Например, предположим, что вы обновляете текст на TextBlock
. Вы могли бы сделать что-то подобное в XAML:
<TextBlock Text="{Binding SomeText}" />
Затем ваш ViewModel (который должен implement the INotifyPropertyChanged interface) определяет это свойство и устанавливает его по своему желанию.
public string SomeText
{
get { return _someText; }
set
{
if (_someText != value)
{
_someText = value;
NotifyPropertyChanged("SomeText");
}
}
}
private string _someText;
...
// At any time, you can set the property, and the
// binding will update the text in the control for you.
SomeText = "Some text";
Если вам абсолютно необходимо манипулировать видами из кода (или, если вы не используете MVVM), соответствующее место для такого рода кода является файл «xaml.cs» рядом с вашей точки зрения (код -за). Вы можете назначить имя для чего-либо в своем xaml, используя синтаксис, например <TextBlock x:Name="SomeTextBlock" />
, а затем получить доступ к нему из кода в качестве переменной-члена с тем же именем. Например, вы можете сделать SomeTextBlock.Text = "Some text"
. Однако это обычно не требуется для подавляющего большинства случаев использования, если вы используете MVVM.
Вы не можете напрямую. В зависимости от того, что вы хотите достичь, привязка к свойствам в виртуальной машине - это, как правило, путь. Что именно вам нужно сделать? – Lennart
Я звоню на событие щелчка кнопки в viewmodel, там я хочу получить доступ к этой кнопке, и ItemControl –
В этом случае передайте сам Button через CommandParameter в свою команду: 'CommandParameter = {Binding RelativeSource = {RelativeSource Self}} '. Я предполагаю, что у вас есть что-то вроде RelayCommand в вашей виртуальной машине, которая принимает CommandParameter как общий параметр Type: 'RelayCommand