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}"/>
我创建了一个用户控件,假设是 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}"/>