2011-01-06 10 views
0

Ich verwende RIA-Services, um Entitäten für eine MVVM-Light-fähige Silverlight-Anwendung bereitzustellen.Anordnen einer Silverlight-Listbox - MVVM-stylee

Ich habe ein ViewModel, das eine CollectionViewSource von Entitäten einer Listbox in der Ansicht präsentiert. Der Grund, warum ich eine CollectionViewSource verwende, ist, dass ich das ausgewählte Element im ViewModel steuern kann. Wenn ein neuer Artikel erstellt wird, kann ich ihn erstellen und ihn zur weiteren Bearbeitung auswählen (die Auswahl eines Artikels in der Listbox ermöglicht die Bearbeitung dieses Artikels in einem Datenformular).

Ich muss das Dragdrapping für die Listbox aktivieren, um eine Neuanordnung der Elemente zu ermöglichen. Ich habe mit dem ListBoxDragDropTarget des Silverlight Toolkits nachgesehen, um diese Funktionalität zu aktivieren, aber es funktioniert nicht - ich nehme an, dies liegt daran, dass ich das Listenfeld ItemsSource auf eine ObservableCollection setzen muss.

Wenn ich die CollectionViewSource im ViewModel in eine ObservableCollection ändern, wie kann ich das ausgewählte Element der Listbox programmgesteuert aus dem ViewModel ändern?

Irgendwelche Ideen?

Antwort

0

können Sie wickeln Ihre ObservableCollection<T> im CollectionViewSource ... als here gesehen ... so, dass es der Träger ist Sammlung von Daten verwendet durch die CollectionViewSource Gewinnung der INotifyCollectionChanged Verhalten, ohne die Vorteile von der CollectionViewSource zu verlieren; die Sie für die Auswahl eines Artikels benötigen.

<UserControl.Resources> 
     <local:DataSource x:Key="dataSource" /> 
      <CollectionViewSource x:Name="cvs" 
        Source="{Binding Names, Source={StaticResource dataSource}}"> 
      </CollectionViewSource> 
    </UserControl.Resources> 

    ... 

    <ListBox ItemsSource="{Binding Source={StaticResource cvs}}" 
       Margin="5,5,5,1" Grid.ColumnSpan="4" /> 

Ein Ende Beispiel von Tim Heuer beenden können here gefunden werden, die auch Sie aus bei der Erreichung der vollständigen Lösung helfen sollte.

+0

Danke Aaron, ich werde es versuchen. – Drammy

+0

Tatsächlich stellt sich heraus, dass ich keine der hier vorgeschlagenen Ansätze für die Arbeit mit dem MVVM-Muster bekommen kann. Es sieht so aus, als wäre es ein Fehler mit dem ListBoxDragDropTarget ... – Drammy

+0

@Drammy Sieh dir das an ... http://silverlightfeeds.com/post /1325/Silverlight_Toolkit_adds_DragDrop_targets.aspx da es ein Ende-zu-Ende-Beispiel hat ... –

1

Sie können eine separate Eigenschaft in Ihrem Ansichtsmodell haben nämlich SelectedThing und binden ListBox.SelectedItem es

<ListBox ItemsSource="{Binding TheCollection}" SelectedItem="{Binding SelectedThing}" /> 
+0

Danke alpha-mouse - Ich habe diesen Ansatz bereits versucht, aber ich muss etwas falsch gemacht haben, da ich es nicht funktionierte, wie ich es wollte. Wenn ich neu anfangen würde, würde ich mit dieser Route gehen. Aber der Vorschlag von Aaron bedeutet weniger Arbeit ... (Ist das nur faul?) – Drammy