C# WPF将祖先对象绑定为CommandParameter
我有一个自定义用户控件,我想放大它。我在MouseDoubleClick上用函数调用测试了这个功能,效果很好。 代码: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" >
好的,我用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>