C# 在发生子对象事件时,如何更改父控件的属性?

C# 在发生子对象事件时,如何更改父控件的属性?,c#,wpf,templates,themes,C#,Wpf,Templates,Themes,我创建了一个自定义控件,我正在为垂直菜单创建一个模板,我想在鼠标滑过列表框的情况下,我可以设置控件的属性值:ModernVerticalMenu, 有什么想法吗 当我写parent时,是ModerVerticalMenu,child是ControlTemplate中的ListBox。主要思想是以某种方式访问父对象并更改其属性。为了做到这一点,我创建了一个附加属性,通过TemplatedParent标记检索对父属性的访问,第二个附加属性存储应该应用于父属性的值。这个样本并不精确,但我相信它是正确

我创建了一个自定义控件,我正在为垂直菜单创建一个模板,我想在鼠标滑过列表框的情况下,我可以设置控件的属性值:ModernVerticalMenu, 有什么想法吗


当我写parent时,是ModerVerticalMenu,child是ControlTemplate中的ListBox。

主要思想是以某种方式访问父对象并更改其属性。为了做到这一点,我创建了一个附加属性,通过TemplatedParent标记检索对父属性的访问,第二个附加属性存储应该应用于父属性的值。这个样本并不精确,但我相信它是正确的。 我想更改按钮内容,它最初是空的。第一个文本块反映了按钮内容的变化,以确定是否发生了任何变化

<Style TargetType="controls:ModernVerticalMenu" >
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate  TargetType="controls:ModernVerticalMenu">
            <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="{TemplateBinding ListWidth}"/>
                                <ColumnDefinition Width="{TemplateBinding ListWidth}"/>
                                <ColumnDefinition Width="auto"/>
                                <ColumnDefinition />
                            </Grid.ColumnDefinitions>


                            <Border Background="{DynamicResource background}" Height="{TemplateBinding Height}" BorderThickness="1" BorderBrush="{DynamicResource bordaSuperior}">
                                <!-- link list -->
                                <ListBox x:Name="LinkList" ItemsSource="{TemplateBinding Links}"  
                                         ScrollViewer.HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}" >
                                    <ListBox.ItemTemplate>
                                        <DataTemplate>
                                            <Grid Height="50" Background="Transparent" Width="500">
                                                <Border Padding="10">
                                                    <Path x:Name="icon" Data="{Binding IconData}" Stretch="Fill" Fill="{DynamicResource Accent}" Width="20" Height="20" HorizontalAlignment="Left" VerticalAlignment="Center" />
                                                </Border>
                                                <TextBlock x:Name="texto" ToolTip="{Binding Tooltip}"  Text="{Binding DisplayName}" Margin="45,2,2,2" FontSize="{DynamicResource MediumFontSize}" TextTrimming="CharacterEllipsis" VerticalAlignment="Center" HorizontalAlignment="Left" />
                                            </Grid>
                                            <DataTemplate.Triggers>
                                                <DataTrigger Binding="{Binding IconData}" Value="{x:Null}">
                                                    <Setter Property="Margin" TargetName="texto">
                                                        <Setter.Value>
                                                            <Thickness Bottom="2" Top="2" Left="10" Right="2"/> 
                                                        </Setter.Value>
                                                    </Setter>
                                                </DataTrigger>
                                                <Trigger Property="IsMouseOver" Value="true">
                                                    <Setter Property="Fill" TargetName="icon">
                                                        <Setter.Value>
                                                            <SolidColorBrush Color="#f2f2f2" />
                                                        </Setter.Value>
                                                    </Setter>
                                                </Trigger>

                                            </DataTemplate.Triggers>
                                        </DataTemplate>
                                    </ListBox.ItemTemplate>
                                </ListBox>
                            </Border>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
     </Setter>
</Style>
当鼠标移到文本框上时,父对象的属性内容将更改为setter中附加属性集的值

public static class MyClass
{
    public static void SetParent(DependencyObject obj, Button val)
    {
        obj.SetValue(ParentProperty, val);
    }

    public static Button GetParent(DependencyObject obj)
    {
        return (Button)obj.GetValue(ParentProperty);
    }
    public static readonly DependencyProperty ParentProperty = DependencyProperty.RegisterAttached("Parent", typeof(Button), typeof(MyClass), new PropertyMetadata(null, new PropertyChangedCallback(
        (x, y) =>
        {
            Debug.WriteLine(GetParent(x));
        })));

    public static void SetContent(DependencyObject obj, string val)
    {
        obj.SetValue(ContentProperty, val);
    }

    public static string GetContent(DependencyObject obj)
    {
        return (string)obj.GetValue(ContentProperty);
    }
    public static readonly DependencyProperty ContentProperty = DependencyProperty.RegisterAttached("Content", typeof(string), typeof(MyClass), new PropertyMetadata(null, new PropertyChangedCallback(
        (x, y) =>
        {
            if (GetContent(x) != String.Empty)
                ((Button)GetParent(x)).Content = GetContent(x);
        })));
}


将此属性中的绑定添加到您的列表框IsMouseOver。您能给我一个示例吗?
public static class MyClass
{
    public static void SetParent(DependencyObject obj, Button val)
    {
        obj.SetValue(ParentProperty, val);
    }

    public static Button GetParent(DependencyObject obj)
    {
        return (Button)obj.GetValue(ParentProperty);
    }
    public static readonly DependencyProperty ParentProperty = DependencyProperty.RegisterAttached("Parent", typeof(Button), typeof(MyClass), new PropertyMetadata(null, new PropertyChangedCallback(
        (x, y) =>
        {
            Debug.WriteLine(GetParent(x));
        })));

    public static void SetContent(DependencyObject obj, string val)
    {
        obj.SetValue(ContentProperty, val);
    }

    public static string GetContent(DependencyObject obj)
    {
        return (string)obj.GetValue(ContentProperty);
    }
    public static readonly DependencyProperty ContentProperty = DependencyProperty.RegisterAttached("Content", typeof(string), typeof(MyClass), new PropertyMetadata(null, new PropertyChangedCallback(
        (x, y) =>
        {
            if (GetContent(x) != String.Empty)
                ((Button)GetParent(x)).Content = GetContent(x);
        })));
}
<Setter Property="local:MyClass.Content" Value="tekst"/>