如何将CommandParameter绑定到x:DataTemplate中父控件的名称?

时间:2012-04-19 13:02:32

标签: wpf binding datatemplate

我在View XAML中有以下内容

<GroupBox Grid.Row="0" Header="Aktionen bei Prüfung Aufbau">
    <ContentControl Content="{Binding BuildUpActions}" ContentTemplate="{StaticResource FullActionListTemplate}" x:Name="BuildUp"/>
</GroupBox>

<GroupBox Grid.Row="1" Header="Aktionen bei Prüfung Abbau">
    <ContentControl Content="{Binding TearDownActions}" ContentTemplate="{StaticResource FullActionListTemplate}" x:Name="TearDown"/>
</GroupBox>

DataTemplate在单独的资源中定义

<DataTemplate x:Key="FullActionListTemplate">
    <DockPanel LastChildFill="True">
        <StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal" HorizontalAlignment="Right">
            <Button Content="Neuer Ausgang" Style="{StaticResource ButtonRowStyle}"
                    Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TabControl}}, Path=DataContext.NewFullIOCommand}" 
                    CommandParameter="{Binding **?HOW?**}"
                    />
            <more buttons here...>
        </StackPanel>
        <ContentControl Content="{Binding}" >

        </ContentControl>
    </DockPanel>
</DataTemplate>

Command在ViewModel中定义

    public ICommand NewFullIOCommand
    {
        get
        {
            if (this._newFullIOCommand == null)
            {
                this._newFullIOCommand = new Mvvm.RelayCommand(parm => DoNewFullIO(parm));
            } return this._newFullIOCommand;
        }
    }

我希望能够确定2个列表中的哪个列表生成了Command。我想将CommandParameter传递给命令处理程序,该处理程序包含x:控件的名称。

如何定义绑定?还有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

我查看了您的示例,并快速编辑了读取CommandParameter的行。执行此更改后,我在Snoop(WPF运行时调试程序)中检查了此项,并将CommandParameter设置为您所描述的要应用的值。

首先,你可以在这里获得Snoop:

Snoop

我可以通过简单的方式将CommandParameter设置为封闭的ContentControl的名称:

<DataTemplate x:Key="FullActionListTemplate">
        <DockPanel LastChildFill="True">
            <StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal" HorizontalAlignment="Right">
                <Button Content="Neuer Ausgang"
                Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TabControl}}, Path=DataContext.NewFullIOCommand}" 
                CommandParameter="{Binding Path=Name, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentControl}}}"
                />
            </StackPanel>
            <ContentControl Content="{Binding}" >

            </ContentControl>
        </DockPanel>
    </DataTemplate>

作为旁注,您的示例几乎在上面的行中包含一个类似的技术,您将绑定到Command属性。

答案 1 :(得分:0)

创建自引用属性

我讨厌WPF。但是,我刚刚这样做:将此属性添加到绑定的datamodel类:

public class MyDataObjectItem
{
    //...
    public MyDataObjectItem Self { get { return this; } }
    //...
}

然后命令参数很简单:

CommandParameter="{Binding Self}"

或者,显然这是有效的

CommandParameter="{Binding}"

请参阅https://stackoverflow.com/a/11287478/887092