C# WPF将祖先对象绑定为CommandParameter

C# WPF将祖先对象绑定为CommandParameter,c#,wpf,data-binding,xaml,mvvm,C#,Wpf,Data Binding,Xaml,Mvvm,我有一个自定义用户控件,我想放大它。我在MouseDoubleClick上用函数调用测试了这个功能,效果很好。 代码: 好的,我用ElementSpy解决了这个问题,看看ElementSpy是如何工作的 以及xaml: <cc:UserControl x:Name="UserControl" ItemsSource="{Binding Path=DataItem}" MouseDoubleClick="UserControl_MouseDoubleClick" >

我有一个自定义用户控件,我想放大它。我在MouseDoubleClick上用函数调用测试了这个功能,效果很好。 代码:


好的,我用ElementSpy解决了这个问题,看看ElementSpy是如何工作的

以及xaml:

    <cc:UserControl x:Name="UserControl" ItemsSource="{Binding Path=DataItem}" MouseDoubleClick="UserControl_MouseDoubleClick" >
        <cc:UserControl.ContextMenu>
            <ContextMenu local:ElementSpy.NameScopeSource="{StaticResource ElementSpy}">
                <MenuItem Header="_Enlarge" Command="{Binding Path=EnlargeCommand}" CommandParameter="{Binding ElementName=UserControl, Path=.}"/>
                </MenuItem>
            </ContextMenu>
        </cc:UserControl.ContextMenu>
    </cc:UserControl>

好的,我用ElementSpy解决了这个问题,来看看ElementSpy是如何工作的

以及xaml:

    <cc:UserControl x:Name="UserControl" ItemsSource="{Binding Path=DataItem}" MouseDoubleClick="UserControl_MouseDoubleClick" >
        <cc:UserControl.ContextMenu>
            <ContextMenu local:ElementSpy.NameScopeSource="{StaticResource ElementSpy}">
                <MenuItem Header="_Enlarge" Command="{Binding Path=EnlargeCommand}" CommandParameter="{Binding ElementName=UserControl, Path=.}"/>
                </MenuItem>
            </ContextMenu>
        </cc:UserControl.ContextMenu>
    </cc:UserControl>


我尝试了该方法,但出现以下错误:System.Windows.Data错误:4:找不到用于绑定的源,引用为“RelativeSource FindAncestor,AncestorType='Site.UserControls.UserControl',AncestorLevel='1'。BindingExpression:Path=EnlargeCommand;DataItem=null;目标元素是“MenuItem”(名称=“”);目标属性为“Command”(类型为“ICommand”)和:System.Windows.Data错误:4:找不到用于绑定的源,引用为“RelativeSource FindAncestor,AncestorType='Site.UserControls.UserControl',AncestorLevel='1'。BindingExpression:(无路径);DataItem=null;目标元素是“MenuItem”(名称=“”);目标属性为“CommandParameter”(类型为“Object”)您能提供一些代码吗?因为它在我的机器上工作!我已经为Lightboxcommand添加了代码,我想就是这样。你认为问题出在Lightboxcommand中吗?好的,我发现了问题所在,但没有好的解决方案。上下文菜单不是同一视觉树的一部分。祖先绑定不起作用,因为上下文菜单不是它所在元素的子元素。我找到的唯一解决方案是这个,但我宁愿在没有itI的情况下解决问题。我尝试过这个解决方案,但出现了以下错误:System.Windows.Data错误:4:找不到用于绑定的源,引用为“RelativeSource FindAncestor,AncestorType='Site.UserControls.UserControl',AncestorLevel='1'。BindingExpression:Path=EnlargeCommand;DataItem=null;目标元素是“MenuItem”(名称=“”);目标属性为“Command”(类型为“ICommand”)和:System.Windows.Data错误:4:找不到用于绑定的源,引用为“RelativeSource FindAncestor,AncestorType='Site.UserControls.UserControl',AncestorLevel='1'。BindingExpression:(无路径);DataItem=null;目标元素是“MenuItem”(名称=“”);目标属性为“CommandParameter”(类型为“Object”)您能提供一些代码吗?因为它在我的机器上工作!我已经为Lightboxcommand添加了代码,我想就是这样。你认为问题出在Lightboxcommand中吗?好的,我发现了问题所在,但没有好的解决方案。上下文菜单不是同一视觉树的一部分。祖先绑定不起作用,因为上下文菜单不是它所在元素的子元素。我们找到的唯一解决办法是这个,但我宁愿不用它来解决问题
public Visibility LightBoxVisible { get; set; }
public bool IsLightBoxVisible { get; set; }

public UserControl CurrentLightBoxItem { get; set; }

private ICommand _lightBoxCommand;
public ICommand LightBoxCommand
{
    get
    {
        if (_lightBoxCommand == null)
            _lightBoxCommand = new RelayCommand(n => {
                if (IsLightBoxVisible == true)
                    LightBoxVisible = Visibility.Hidden;
                else
                {
                    LightBoxVisible = Visibility.Visible;
                    CurrentLightBoxItem = ((UserControl)n).Copy();
                    NotifyPropertyChanged("CurrentLightBoxItem");
                }

                IsLightBoxVisible = !IsLightBoxVisible;
                NotifyPropertyChanged("LightBoxVisible");
            });
        return _lightBoxCommand;
    }
}
CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type cc:UserControl}}}"
    <cc:UserControl x:Name="UserControl" ItemsSource="{Binding Path=DataItem}" MouseDoubleClick="UserControl_MouseDoubleClick" >
        <cc:UserControl.ContextMenu>
            <ContextMenu local:ElementSpy.NameScopeSource="{StaticResource ElementSpy}">
                <MenuItem Header="_Enlarge" Command="{Binding Path=EnlargeCommand}" CommandParameter="{Binding ElementName=UserControl, Path=.}"/>
                </MenuItem>
            </ContextMenu>
        </cc:UserControl.ContextMenu>
    </cc:UserControl>