将CommandParameter属性绑定到另一个对象的属性

时间:2011-03-05 16:46:00

标签: .net wpf data-binding

可能是一个愚蠢的问题,但现在是:

<StackPanel Orientation="Horizontal">
    <TextBox x:Name="InsName" Margin="3" Width="180"/>
    <Button Command="cc:MyCommands.AddObject" CommandParameter="{Binding ElementName=InsName, Path=Text}" >Ok</Button>
</StackPanel>

有人可以解释为什么单击按钮时发送的CommandParameter始终为NULL?如何正确地将参数绑定到另一个元素的属性?

提前致谢!

PS:代码的更大部分,只是为了给出一些上下文(除了我上面展示的部分之外,所有代码都完美无缺)

<TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Children}">
                <StackPanel Orientation="Horizontal" AllowDrop="{Binding IsGroupNode}" Drop="NodeDrop" DragEnter="NodeOver" DragLeave="NodeLeave">
                    <CheckBox Click="nodeChecked" IsChecked="{Binding IsChecked, Mode=TwoWay}" Visibility="{Binding IsObjectNode, Converter={StaticResource bool2vis}}" />
                    <TextBlock Text="{Binding Text}" Foreground="{Binding TextColor}" PreviewMouseLeftButtonDown="startDragging">
                        <TextBlock.ContextMenu>
                            <ContextMenu>
                                <MenuItem Header="Add Item">
                                    <StackPanel Orientation="Horizontal" IsEnabled="{Binding IsGroupNode}">
                                        <TextBox Name="InsName" Margin="3" Width="180"/>
                                        <Button Command="cc:MyCommands.AddObject" CommandParameter="{Binding ElementName=InsName, Path=Text}" Height="22" Width="30" IsDefault="True">Ok</Button>
                                    </StackPanel>
                                </MenuItem>
                                <MenuItem Header="Remove" Command="cc:MyCommands.RemoveObject" />
                                <Separator />
                                <MenuItem Command="cc:MyCommands.UncheckAll" IsEnabled="{Binding IsGroupNode}" />
                            </ContextMenu>
                        </TextBlock.ContextMenu>
                    </TextBlock>
                </StackPanel>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>

2 个答案:

答案 0 :(得分:1)

检查“输出”窗口,如果绑定失败,那里应该有一条消息。

答案 1 :(得分:1)

我已经忘记了这个问题,但万一有人遇到同样的问题,这就是答案:

问题是binding位于DataTemplate内,因此直接绑定名称将不起作用,因为对象是在运行时动态创建的。

一种可能的解决方案是使用RelativeSrouce导航到父级,然后使用Path“退回”到TextBox

<StackPanel Orientation="Horizontal" IsEnabled="{Binding IsGroupNode}">
    <TextBox Name="InsName" Margin="3" Width="180"/>
    <Button Command="cc:MyCommands.AddObject" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=StackPanel}, Path=Children[0].Text}" Height="22" Width="30" IsDefault="True">Ok</Button>
</StackPanel>