2017-01-26 79 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() 
     { 
     } 
} 

我不確定在Model中保留ActionCommand是否正確?如何在MVVM模式下正確實現這個? ActionCommand應該放在哪裏,以及如何將它綁定到Button的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

謝謝你的回答。這將工作,但我不知道如何確定哪些_應用程序應傳遞給命令行動? 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具有name和colorRgb的屬性。事實上,如果你想使用正確的MVVM模式,那麼colorRgb不應該在視圖模型或模型中。這是一個觀點術語。你應該使用一個轉換器(閱讀IValueConverter)爲每個按鈕設置不同的顏色(儘管它不是UX友好的)。

而最後一件事,就像名字屬性應該是名稱(大寫N)在C#屬性名稱應始終以大寫字母開頭。

+0

謝謝你的回答。你說得對,使用ICommand會更好,我會糾正這一點。但是,我應該保持模型中的命令? – Crekate

+0

當然。如果操作是每個模型不同,那麼命令的地方是在模型中。 –