2017-01-26 7 views
3

У меня есть список приложений, который привязан к ListView.Связывание команды с элементами ListView MVVM надлежащим образом

private List<_Application> _applicationList; 

     public List<_Application> applicationList 
     { 
      get { return _applicationList; } 
      set 
      { 
       _applicationList = value; 
       OnPropertyChanged(); 
      } 
     } 

ListView ItemTemplate задается как кнопка.

<ListView 
      ItemsSource="{Binding applicationList}" 
      BorderThickness="5" 
      Style="{DynamicResource ListViewStyle}"> 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <Button 
         Command="{Binding RunCommand}" 
         Style="{StaticResource ApplicationButtonStyle}" 
         Content="{Binding name}" 
         Background="{Binding colorRGB}" > 
        </Button> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 

Когда я нажимаю на кнопку, я хочу, чтобы приложение запускалось. В моей модели _Application есть ActionCommand, которые запускают процессы.

public class _Application 
    { 
     public ActionCommand RunCommand 
     { 
      get 
      { return new ActionCommand(action => Run()); } 
     } 
     private void Run() 
     { 
      Process p = new Process(); 
      p.StartInfo.FileName = path; 

      try 
      { 
       p.Start(); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 

     } 

     public _Application() 
     { 
     } 
} 

Я не уверен, правильно ли соблюден действие ActionCommand в Модели? Как правильно реализовать это в шаблоне MVVM? Где должен быть размещен ActionCommand и как связать его с ListView кнопок, так что будет запущено правильное _Application?

ответ

1

Я думаю, что лучший способ - передать модель (_Application) как параметр в команду.

RunCommand = new RelayCommand(param => this.OnRun(param)); 

Действие команды

private void OnRun(_Application app) 
{ 
    //Any action with your model 
} 

Xaml

Command="{Binding DataContext.RunCommand, ElementName=PageRootKey}" 
CommandParameter="{Binding Mode=OneWay}"> 
+0

Благодарим вас за ответ. Это будет работать, однако я не знаю, как определить, какие _Applications должны быть переданы командам? ListView.SelectedItem не работает, так как я нажимаю кнопку, а не выбираю элемент, а затем нажимаю. – Crekate

+0

Как я понимаю, вы хотите передать 'SelectedItem' команде. 'CommandParameter =" {Binding SelectedItem, ElementName = ListViewName} "' –

+0

Нет, я этого не делаю, я просто пропустил CommandParameter. Все работает нормально. Огромное спасибо. – Crekate

0

Прежде всего, вы должны использовать ICommand и не ActionCommand от одной простой причине, если в будущем вы хотите заменить ActionCommand в чем-то лучшем, который реализует ICommand, вам не нужно заменять так много мест в коде.

public ICommand RunCommand 
    { 
     get 
     { return new ActionCommand(Run); } 
    } 

Правильный _Application будет работать, поскольку каждый элемент в списке связан с одним пунктом _Application в коллекции.

Примечание: в приведенном выше коде я написал ... ActionCommand (Run); поскольку ActionCommand принимает параметр Action, вы можете написать код в ближайшее время и более легко читаемым.

Я предполагаю, конечно, в полном коде _Application имеет свойства имени и colorRgb. На самом деле, если вы хотите использовать правильный шаблон MVVM, тогда colorRgb не должен находиться в модели viewmodel или модели. Это точка зрения. Вы должны использовать конвертер (читайте IValueConverter), чтобы установить другой цвет для каждой кнопки (хотя это не UX-софт).

И последнее, свойство, как имя, должно быть Name (capital N), поскольку имена свойств в C# всегда должны начинаться с заглавных букв.

+0

Спасибо за ваш ответ. Вы правы, что использование ICommand будет лучше, я исправлю это. Однако должен ли я хранить команду в модели? – Crekate

+0

Конечно. Если действие различно для каждой модели, то место команды находится в модели. –

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

  • Нет связанных вопросов^_^