Hallo!
Wie die Überschrift schon suggeriert möchte ich beim Überstreichen einer GridViewColumn den Wert einer VM-Eigenschaft setzen (z.B. die aktuelle Spalten-Nummer).
Das GridViewColumn hat keine Events. Über einen ListViewItem-Style könnte ich zwar beim Maus-Überstreichen eine Objekt-Eigenschaft setzen (<Setter Property=""), aber ich habe keinen Weg gefunden darüber eine VM-Eigenschaft zu setzen.
<Style TargetType="{x:Type ListViewItem}" x:Key="ListViewItemMouseOver">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Green"/>
</Trigger>
</Style.Triggers>
</Style>
<Style TargetType="ListView" x:Key="ListViewMouseOverStyle">
<Setter Property="ItemContainerStyle" Value="{StaticResource ListViewItemMouseOver}"/>
</Style>
Außerdem erfasse ich durch den ListViewItemStyle nur die gesamte "Zeile" nicht die Spalte, über die der der Maus-Zeiger steht.
Kennt ihr da eine Lösung?
Hallo!
Ich habe es jetzt erst einmal so gelöst, dass ich über ein CellTemplate → DataTemplate einem TextBlock einen MausOver-Behavior zuordne und in diesem über die Tag-Eigenschaft die Spaltenzuordnung an die VM-Eigenschaft übertrage.
<GridViewColumn>
<GridViewColumn.Header>
<TextBlock Text="Datei-Name (Spalte 3)" />
</GridViewColumn.Header>
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding DateiName}" Tag="3">
<i:Interaction.Behaviors>
<local:MouseOverSpaltenBehavior/>
</i:Interaction.Behaviors>
</TextBlock>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
Behavior:
/// <summary>
/// MouseOver Spalten-Behavior
/// </summary>
public class MouseOverSpaltenBehavior : Behavior<TextBlock>
{
/// <summary>
/// MouseOverBehavior -> Loaded +
/// </summary>
protected override void OnAttached() => AssociatedObject.IsMouseDirectlyOverChanged += AssociatedObject_IsMouseDirectlyOverChanged;
/// <summary>
/// MouseOverBehavior -> Loaded -
/// </summary>
protected override void OnDetaching() => AssociatedObject.IsMouseDirectlyOverChanged -= AssociatedObject_IsMouseDirectlyOverChanged;
private void AssociatedObject_IsMouseDirectlyOverChanged(object sender, DependencyPropertyChangedEventArgs e)
{
TextBlock tb = (TextBlock)sender;
VMDateiSystem vm = (VMDateiSystem)arWPF.WPF_Tools.WPF_Tools.VisualTreeHelpers.FindAncestor<Window>(tb).DataContext;
vm.AktSpalte = Convert.ToInt16(tb.Tag, App.GebietsSchemaDE);
}
}
Ist ganz schön "durch die Brust", aber vielleicht geht es ja noch einfacher?