Diese funktionieren sollte. Die Idee ist, dass Sie diese angehängte Eigenschaft haben, die Sie an die DataGrid
anhängen werden. In der XAML, wo Sie es anhängen, binden Sie es an eine Eigenschaft auf Ihrem ViewModel
. Wenn Sie dem Wert SelectedItem
programmgesteuert einen Wert zuweisen möchten, legen Sie auch einen Wert für diese Eigenschaft fest, an die die angefügte Eigenschaft gebunden ist.
Ich habe den angehängten Eigenschaftstyp gemacht, was auch immer der SelectedItem
Typ ist, aber ehrlich gesagt ist es egal, was der Typ ist, solange Sie es auf etwas anderes als das, was es vorher war, setzen. Diese angefügte Eigenschaft wird nur dazu verwendet, um Code auf dem Ansichtssteuerelement (in diesem Fall ein DataGrid
) in einer MVVM-freundlichen Weise auszuführen.
Also, das heißt, hier ist der Code für die angefügten Eigenschaft:
namespace MyAttachedProperties
{
public class SelectingItemAttachedProperty
{
public static readonly DependencyProperty SelectingItemProperty = DependencyProperty.RegisterAttached(
"SelectingItem",
typeof(MySelectionType),
typeof(SelectingItemAttachedProperty),
new PropertyMetadata(default(MySelectionType), OnSelectingItemChanged));
public static MySelectionType GetSelectingItem(DependencyObject target)
{
return (MySelectionType)target.GetValue(SelectingItemProperty);
}
public static void SetSelectingItem(DependencyObject target, MySelectionType value)
{
target.SetValue(SelectingItemProperty, value);
}
static void OnSelectingItemChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
var grid = sender as DataGrid;
if (grid == null || grid.SelectedItem == null)
return;
// Works with .Net 4.5
grid.Dispatcher.InvokeAsync(() =>
{
grid.UpdateLayout();
grid.ScrollIntoView(grid.SelectedItem, null);
});
// Works with .Net 4.0
grid.Dispatcher.BeginInvoke((Action)(() =>
{
grid.UpdateLayout();
grid.ScrollIntoView(grid.SelectedItem, null);
}));
}
}
}
Und hier ist die XAML-Code-Schnipsel:
<Window ...
xmlns:attachedProperties="clr-namespace:MyAttachedProperties">
...
<DataGrid
attachedProperties:SelectingItemAttachedProperty.SelectingItem="{Binding MyViewModel.SelectingItem}">
...
</DataGrid>
</Grid>
Welchen Fehler bekommen Sie, wenn Sie versuchen, das 'Verhalten' zu implementieren? – Gjeltema
@Gjeltema 'Der Typ oder Namespace-Name 'Behaviour' konnte nicht gefunden werden (fehlt eine using-Direktive oder eine Assembly-Referenz?)' – Andy
Haben Sie einen Verweis auf System.Windows.Interactivity.dll in Ihrem Projekt? – Gjeltema