wpf中如何获取父控件的对象

How to get the object of parent usecontrol in wpf

我创建了一个用户控件,假设是 UserControl1。我有一个子控件按钮,通过单击它我想将 UserControl1 的对象和与按钮绑定的数据传递给转换器。我正在使用 MVVM 模式执行命令。

假设用户控件的 Xaml 文件结构如下

<local:UserControl1 x:Class="UserControl1
xmlns:Converters="clr-namespace:MyConverter" 
xmlns:......>

在 Xaml 的某处有一个包含 ListItem 的列表框和一个用于对列表框执行某些操作的按钮,如下所示

 <ListBox x:Name="SomeViewmodel" MinWidth="300" MaxWidth="300" Height ="Auto"  HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"  >
<ListBox.ItemTemplate>
     <DataTemplate>
             <Grid x:Name="LayoutGrid">
                 <Grid.ColumnDefinitions>
                     <ColumnDefinition Width="*" />
                     <ColumnDefinition Width="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ActualHeight}" />
                 </Grid.ColumnDefinitions>
                 <TextBlock Text="{Binding someproperty}" Grid.Column="0">
                 </TextBlock>
                 <Border 
                     <Button x:Name="btn1" ">
                         <Image Source="someImage.png"/>
                         <i:Interaction.Triggers>
                             <i:EventTrigger EventName="Click">
                                    <i:InvokeCommandAction Command="Commands:MyCommand" >
                                       <i:InvokeCommandAction.CommandParameter>
                                        <MultiBinding Converter="{Converters:MyConverter}">
                                            <Binding />
                                            <Binding  Source="{RelativeSource Mode=FindAncestor, AncestorType={x:Type local:UserControl1}}"  />
                                        </MultiBinding>
                                    </i:InvokeCommandAction.CommandParameter>
                                </i:InvokeCommandAction>
                             </i:EventTrigger>
                         </i:Interaction.Triggers>
                     </Button>
                 </Border>
             </Grid>
         </DataTemplate>
 </ListBox.ItemTemplate>

我可以将对象发送到转换器,但转换器收到的对象是 System.Windows.Data.RelativeSource 类型,而它应该是 UserControl1 .

我错过了什么?或者我应该怎么做才能从 RelativeSourceObject 获取 UserControl1 对象?

您的绑定应该如下:

<MultiBinding Converter="{Converters:MyConverter}">
    <Binding />
    <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type local:UserControl1}}"  />
</MultiBinding>

即绑定应该使用 RelativeSource 属性,而不是 Source 属性.

更新:

试试这个代码:

<Binding RelativeSource="{RelativeSource Self}"/>