ScrollIntoView für WPF-DataGrid - (MVVM -)
Ich bin mit dem MVVM-pattern, und ich habe eine Bindung im XAML-Code für das SelectedItem an ein DataGrid. Ich programmgesteuert setzen Sie die SelectedItem, aber wenn ich tun, damit das DataGrid nicht scrollen zur Auswahl. Gibt es eine Möglichkeit, kann ich dies erreichen, ohne Sie komplett zu brechen, das MVVM-pattern?
Ich die folgende Lösung gefunden, aber ich erhalte eine Fehlermeldung, wenn ich versuche zu implementieren, die Behavior
Klasse, obwohl ich es installiert habe, Blend SDK: http://www.codeproject.com/Tips/125583/ScrollIntoView-for-a-DataGrid-when-using-MVVM
Welche Fehler haben Sie, wenn Sie versuchen, zu implementieren, die
Haben Sie einen Verweis auf System.Windows.Interactivity.dll in Ihrem Projekt?
Ich kann nicht sehen. Wird das hinzufügen von ein bedeutet, dass ich dem Schiff noch eine andere DLL mit mein Programm aber?
Wenn Sie wollen, sind zu nutzen
Behavior
?The type or namespace name 'Behavior' could not be found (are you missing a using directive or an assembly reference?)
Haben Sie einen Verweis auf System.Windows.Interactivity.dll in Ihrem Projekt?
Ich kann nicht sehen. Wird das hinzufügen von ein bedeutet, dass ich dem Schiff noch eine andere DLL mit mein Programm aber?
Wenn Sie wollen, sind zu nutzen
Behavior
s (was müssen Sie für diese Funktion, mit der Sie gerade arbeiten, wie auch andere Dinge), dann ja, müssen Sie diese dll. Diese dll sollte in der Mischung SDK und registriert worden sind, wenn Sie es installiert haben.InformationsquelleAutor Andy | 2013-08-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollte diese Arbeit. Die Idee ist, Sie habe diese angefügte Eigenschaft, die Sie Heften sich an die
DataGrid
. In der xaml-Code, wo Sie es anbringen, werden Sie binden Sie es auf einem Grundstück, auf IhreViewModel
. Wann immer Sie wollen, um programmgesteuert einen Wert zuweisen, dieSelectedItem
Sie auch einen Wert für diese Eigenschaft, die die angefügte Eigenschaft gebunden ist.Ich gemacht habe, der die angefügte Eigenschaft Typ zu sein, was die
SelectedItem
Typ ist, aber ehrlich, es ist egal, was der Typ ist, solange man es auf etwas anderes als das, was es vorher war. Diese angefügte Eigenschaft nur als ein Mittel zum ausführen von code auf dem view-Steuerelement (in diesem Fall einDataGrid
) in einer MVVM-freundliche Mode.So, gesagt, hier ist der code für die angefügte Eigenschaft:
Und hier ist der xaml-Ausschnitt:
System.Windows.Threading.Dispatcher' does not contain a definition for 'InvokeAsync' and no extension method 'InvokeAsync' accepting a first argument of type 'System.Windows.Threading.Dispatcher' could be found (are you missing a using directive or an assembly reference?)
. Irgendwelche Ideen, warum? Ich habe mich verändertMySelectionType
Entschuldige bitte, ich arbeite immer noch in .Net 4.5. Ich werde aktualisieren, meine Antwort zu reflektieren .Net 4.0.
oh ok, haha, das ist in Ordnung! Es funktioniert nun perfekt - eine weniger DLL! Wünschte, ich könnte upvote deine Antwort wieder!
Froh geholfen zu haben!
Ich erweiterte diese mit Hilfe von Vorlagen (ScrollIntoViewAttachedProperty<TItem>), und erstellen Sie anschließend konkrete Abhängigkeit der Eigenschaften für unterschiedliche Arten durch die Deklaration einer 'one line' Klasse ' (public class SelectedLogEntryAttachedProperty : ScrollIntoViewAttachedProperty<SCPLogEntry> { }), so kann es referenziert auf das XAML. Weiss einer wie auf einem generischen Typ in XAML zu vermeiden, erstellen Sie diese 'one line'Klasse'?
InformationsquelleAutor Gjeltema
Ich bin neu in MVVM. Ich verstehe die Idee von MVVM und umzusetzen versuchen alles richtig.
Ich hatte ein ähnliches problem vor und ich endete mit 1 line-in XAML und 1 Zeile im code-behind. Der rest des Codes ist in der VM.
Ich habe Folgendes in XAML
Und diese in der code-behind:
und dies funktioniert gut.
Ich weiß, dass einige Leute nicht wollen, auch nur eine Zeile code in den code hinter dem Fenster. Aber ich denke, diese 1 Zeile ist nur für die Ansicht. Es hat nichts zu tun mit den Daten oder mit der Logik der Daten. Also ich würde denken, das ist kein Verstoß gegen das MVVM-Prinzip - und so viel einfacher zu implementieren.
Jegliche Kommentare sind willkommen.
ScrollIntoView
wie würde der code eine NullReferenceException ausgelöst, die auf das entfernen eines Elements aus der ItemsSource-und nicht jedes ausgewählte Element.InformationsquelleAutor Edgar