2016-06-06 6 views
0

Ich baue meine erste MVVM-Anwendung in WPF. In diesem Moment versuche ich ein Ereignis durch einen Doppelklick auf ein Element in einer Listbox auszulösen. Dieses Ereignis wird von der Ansicht behandelt, wie unten im Code gezeigt.MVVM Ereignis zu ViewModel anzeigen

Jetzt möchte ich das ViewModel den Index des Elements in der Listbox senden, die doppelt geklickt wird. Wie mache ich das?

PS: die classobject und die ClassDiagram sind beide benutzerdefinierte Klassen, haben sie beide das gleiche Attribut "Name"

Ansicht

public partial class ProjectView : UserControl 
    { 
     public ProjectView() 
     { 
      InitializeComponent(); 
      this.DataContext = new ProjectViewModel(); 
     } 

     public void listBoxProject_MouseDoubleClick(object sender,MouseButtonEventArgs e) 
     { 
      MessageBox.Show(listBoxProject.SelectedIndex.ToString()); //Send index to ViewModel 
     } 
    } 

XAML

<ListBox x:Name="listBoxProject" ItemsSource="{Binding CollectionList}" HorizontalAlignment="Stretch" Margin="-1,32,-1,-1" VerticalAlignment="Stretch" Width="auto" Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" 
      DisplayMemberPath="Name" 
      SelectedValuePath="Name" 
      > 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource {x:Type ListBoxItem}}"> 
      <EventSetter Event="MouseDoubleClick" Handler="listBoxProject_MouseDoubleClick"/> 
     </Style> 
    </ListBox.ItemContainerStyle> 
</ListBox> 

Ansichtsmodell

namespace VITUMLEditor.ViewModels 
{ 
    public class ProjectViewModel:BaseViewModel 
    { 
     private readonly CompositeCollection collectionList = new CompositeCollection(); 

     public ICommand AddClassCommand 
     { 
      get { return new DelegateCommand(AddClass); } 
     } 

     public ICommand AddClassDiagramCommand 
     { 
      get { return new DelegateCommand(AddClassDiagram); } 
     } 

     private void AddClass() 
     { 
      collectionList.Add(new ClassObject("Class" + ClassObject.Key, VisibilityEnum.Public)); 
     } 

     private void AddClassDiagram() 
     { 
      collectionList.Add(new ClassDiagram("ClassDiagram" + ClassDiagram.Key)); 
     } 

     public CompositeCollection CollectionList 
     { 
      get { return collectionList; } 
     } 
    } 
} 
+0

hier Versuchen http://stackoverflow.com/questions/14025530/ how-to-bind-mausdouble-click-command-in-mvvm –

Antwort

-2

Im Prinzip sollten Sie dies mit einem Befehl tun. Aber dann müssen Sie Code schreiben, damit der Doppelklick den Befehl aufruft. Das Folgende ist einfach genug und gut genug für eine sehr große Anzahl von Fällen. Wir haben Dutzende von diesen im Produktionscode und sie verursachen uns keine Schmerzen, weil die fraglichen view-viewmodel-Beziehungen alle 1: 1 sind und es auch bleiben werden. Bedenken Sie, dass es unreine MVVM ist, und können Sie Ihre Optionen beliebig einschränken.

In eine entsprechend benannte und parametrisierte Methode zum Viewmodel:

public void ActivateItem(object item) 
{ 
    // Better if these two classes share a common base class or interface with 
    // a virtual function to be called in this case, but there I go ranting from 
    // the pulpit again. 
    if (item is ClassObject) 
    { 
     // Stuff 
    } 
    else if (item is ClassDiagram) 
    { 
     // Other stuff 
    } 
} 

Und es aus der Sicht nennen:

// This is faintly sketchy, in many people's view, because in principle 
// a view can have any type of viewmodel that has properties of the 
// appropriate names and types. You *could* make many viewmodels all 
// implement some interface that supports common stuff, and make this that 
// type. That wouldn't save you from the MVVM Inquisition, but it would be 
// more flexible than this. 
protected ProjectViewModel ViewModel { get { return DataContext as ProjectViewModel; } } 

public void listBoxProject_MouseDoubleClick(object sender,MouseButtonEventArgs e) 
{ 
    // WARNING you need to add range checking here 
    var lb = sender as ListBox; 
    var item = lb.Items[lb.SelectedIndex]; 

    ViewModel.ActivateItem(item); 
} 
+0

Vielen Dank! Ich habe den Code im Event auf 'ViewModel.OpenClassDiagram (listBoxProject.SelectedItem) bearbeitet;' Das hat den Trick gemacht – Basseytje

+0

Sie haben Code zu View hinzugefügt, so dass es jetzt nicht MVVM ist. – Szymson