2017-07-03 148 views
0

我有一個列表視圖。我已經實現了MVVM模式。WPF MVVM:從視圖模型訪問列表視圖對象

現在,在視圖中,我定義爲ItemContainerStyle列表視圖如下:

<ListView.ItemContainerStyle> 
    <Style TargetType="ListViewItem"> 
      <Setter Property="IsSelected" Value="{Binding IsSelected}"/> 
      <EventSetter Event="PreviewMouseLeftButtonDown" Handler="lstItemContact_MouseDown" /> 
      <EventSetter Event="PreviewMouseMove" Handler="lstItemContact_MouseMove" /> 
    </Style> 
</ListView.ItemContainerStyle> 

,並在後面的代碼(xaml.cs)我有以下事件,例如,的PreviewMouseLeftButtonDown:

private void lstItemContact_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.LeftButton == MouseButtonState.Pressed) 
     { 

      // Get the current mouse position 
      Point mousePos = e.GetPosition(null); 
      Vector diff = _startPoint - mousePos; 

      if (
    Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance || 
    Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance) 
      { 
       if (e.Source != null) 
       { 
        List<DataModel> myList = new List<DataModel>(); 
        foreach (DataModel Item in lvUsers.SelectedItems) 
        { 
         myList.Add(Item); 
        } 

        DataObject dataObject = new DataObject(myList); 
        DragDrop.DoDragDrop(lvUsers, dataObject, DragDropEffects.Move); 
       } 
      } 
     } 
    } 

lstItemContact_MouseMove事件是我實現的拖放功能的一部分。

lvUsers是我在視圖和我的數據模型中的列表視圖,假設您是DataModel。

它好的工作,但現在我想從視圖中移動「lstItemContact_MouseMove」事件給我的視圖模型,並使用一個ICommand(也許可以通過爲參數列表視圖對象的ICommand的,我不知道)。我的問題是,我不知道如何才能通過列表視圖作爲參數傳遞給函數訪問我從視圖模型的列表視圖(lvUsers):

DragDrop.DoDragDrop(lvUsers, dataObject, DragDropEffects.Move); 

的「lstItemContact_MouseMove」事件中。

那麼我該如何做到這一點?

+2

你爲什麼要實現在首位的視圖模型拖和拖放操作? – mm8

+0

@ mm8那麼我在MVVM wpf中很新。因爲我不知道是否正確建立視圖和數據模型之間的依賴關係。這是一個很好的做法?它是否尊重MVVM原則? – user1624552

回答

2

我想行動的你的情況最好的做法可以是:

  1. 留在代碼隱藏,不要擔心。
  2. 做出一個行爲。

您的視圖模型不應該像拖動&降UI的事項有關,但一個獨立的Behavior是把它的好地方。

您還可以在MSDN讀了它或CodeProject

+0

我非常喜歡你的行爲解決方案。我會盡力去做。如果我有任何問題,我會告訴你。 – user1624552