Laden...

GridViewColumn Mouse Over => Set VM-Property

Letzter Beitrag vor einem Monat 2 Posts 222 Views
GridViewColumn Mouse Over => Set VM-Property

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?