2015-06-18 2 views
-1

Я хочу вызвать элементы управления внутри, как кнопка и шаблон элемента внутри viewmodel. Расскажите, как я могу это сделать. Мой просмотр содержитУправление вызовами внутри вида (файл xaml) в viewmodel

<ItemsControl Name="cDetails" 
      Width="395" 
      ItemTemplate="{DynamicResource Test}" 
      ItemsSource="{Binding ViewModels}" 
      Visibility="{Binding IsLoaded, 
           Converter={StaticResource visibilityConverter}}"> 

    <Button Name="btnComplete" 
     Grid.Column="1" 
     HorizontalAlignment="Center" 
     Command="{Binding AuditCommand}" 
     CommandParameter="1"> 
     Complete 
    </Button> 

Пожалуйста, расскажите, как я могу назвать эти элементы в своей модели просмотра с помощью vb.net.

Благодаря

+2

Вы не можете напрямую. В зависимости от того, что вы хотите достичь, привязка к свойствам в виртуальной машине - это, как правило, путь. Что именно вам нужно сделать? – Lennart

+0

Я звоню на событие щелчка кнопки в viewmodel, там я хочу получить доступ к этой кнопке, и ItemControl –

+0

В этом случае передайте сам Button через CommandParameter в свою команду: 'CommandParameter = {Binding RelativeSource = {RelativeSource Self}} '. Я предполагаю, что у вас есть что-то вроде RelayCommand в вашей виртуальной машине, которая принимает CommandParameter как общий параметр Type: 'RelayCommand

ответ

2

Доступ ваших компонентов Вид изнутри вашего 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.

0

Вам не следует пытаться обращаться к элементам управления непосредственно из ViewModel. ViewModel не должен знать о реализации View.

Вместо этого в WPF мы соединяем View и ViewModel через Bindings. Связывание соединяет свойства элементов управления в представлении с помощью свойств в ViewModel.

Команды являются особым типом свойства, которое может быть связано как действие для элементов управления, таких как Button.

В вашем примере, вы должны были бы иметь эти свойства в вашем ViewModel:

  • Коллекция имени ViewModels
  • Логическое имени IsLoaded
  • И ICommand имени AuditCommand

Управляя этими свойствами, вы должны иметь возможность контролировать то, что показано в вашем представлении и его поведении.

Если вам нужно больше контроля, создайте дополнительные привязки к другим свойствам или создайте некоторые события в вашей модели ViewModel и управляйте ими из кода кода View.

Смежные вопросы