当前位置: 首页 > 知识库问答 >
问题:

EventTo命令祖先绑定WPF

阎裕
2023-03-14

调用时出现问题

 <i:Interaction.Triggers>
 <i:EventTrigger EventName="MouseDoubleClick">
 <Command:EventToCommand Command="{Binding Path=Test, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ViewModel:ListViewModel}}}" />
  </i:EventTrigger>
  </i:Interaction.Triggers>

System. Windows. Data错误:4:找不到引用“RelativeSource FindAncestor, AncestorType='PhotoBrowser. List. ViewModel. ListViewModel', AncestorLine='1”的绑定源。BindingExpress:路径=测试;数据项=空;目标元素是“EventTo命令”(HashCode=37598799);目标属性是“命令”(类型“I命令”)

如何修复?列表视图模型:

namespace PhotoBrowser.List.ViewModel
{
    public class ListViewModel : ViewModelBase
    {

        public ObservableCollection<Item> Items { get; set; }

        public ListViewModel()
        {
            Items = new ObservableCollection<Item>();
        }
        public RelayCommand Test
        {
            get;
            set;
        }
        public RelayCommand DoubleClickOnItem
        {
            get
            {
                return new RelayCommand(() => OpenEdit());
            }
        }

        private void OpenEdit()
        {
            Messenger.Default.Send(new NotificationMessage("Edit"));
        }

        public RelayCommand<DragEventArgs> Drop
        {
            get
            {
                return new RelayCommand<DragEventArgs>(CheckInstanceCertificate);
            }
        }

        private void CheckInstanceCertificate(DragEventArgs args)
        {
            var path = string.Join("", (string[])args.Data.GetData(DataFormats.FileDrop, true));
            Items.Add(new Item { ImagePath = path });
        }
    }

}

列表视图. xaml

<UserControl x:Class="PhotoBrowser.List.View.ListView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
             xmlns:Command="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Platform"
             xmlns:ViewModel="clr-namespace:PhotoBrowser.List.ViewModel"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300"
             DataContext="{Binding Source={StaticResource Locator}, Path=List}"
             >
    <UserControl.Resources>
        <Style x:Key="FileItemStyle" TargetType="{x:Type ListViewItem}">
            <Setter Property="Margin" Value="5,5,5,5"/>
            <Setter Property="Padding" Value="0,0,0,0"/>
            <Setter Property="HorizontalAlignment" Value="Left"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate  TargetType="{x:Type ListViewItem}">
                        <Grid HorizontalAlignment="Left" VerticalAlignment="Top" Height="50" >
                            <Border x:Name="border" BorderBrush="{x:Null}" BorderThickness="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" CornerRadius="2.5"/>
                            <StackPanel HorizontalAlignment="Stretch"  VerticalAlignment="Stretch">
                                <ContentPresenter/>
                            </StackPanel>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </UserControl.Resources>
    <Grid>
        <ListView ItemsSource="{Binding Items}" ScrollViewer.HorizontalScrollBarVisibility="Disabled"
              ItemContainerStyle="{StaticResource FileItemStyle}" AllowDrop="True">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Drop">
                    <Command:EventToCommand Command="{Binding Drop}" PassEventArgsToCommand="True" />
                </i:EventTrigger>
            </i:Interaction.Triggers>

            <ListView.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel/>
                </ItemsPanelTemplate>
            </ListView.ItemsPanel>

            <ListView.ItemTemplate>
                <DataTemplate>
                    <DockPanel>
                        <Image Source="{Binding ImagePath}" Height="64" Width="64">
                            <i:Interaction.Triggers>
                                <i:EventTrigger EventName="MouseDoubleClick">
                                    <Command:EventToCommand Command="{Binding Path=Test, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ViewModel:ListViewModel}}}" />
                                </i:EventTrigger>
                            </i:Interaction.Triggers>
                        </Image>
                    </DockPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>
</UserControl>

共有1个答案

法兴德
2023-03-14

看看:

AncestorType={x:Type ViewModel:ListViewModel}

ViewModel 不是祖先,因为 ViewModel 在您的视图中没有控件。正确的是:

  • 列表视图(父级)
    • 列表视图项(子项)

    相反,您应该绑定到ListView的DataContext(因为这是您的ViewModel):

    <Command:EventToCommand Command="{Binding Path=DataContext.Test, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListView}}}"/>
    

 类似资料:
  • 主要内容:向上遍历 DOM 树,jQuery parent() 方法,实例,jQuery parents() 方法,实例,实例,jQuery parentsUntil() 方法,实例祖先是父、祖父或曾祖父等等。 通过 jQuery,您能够向上遍历 DOM 树,以查找元素的祖先。 向上遍历 DOM 树 这些 jQuery 方法很有用,它们用于向上遍历 DOM 树: parent() parents() parentsUntil() jQuery parent() 方法 parent() 方法返回被

  • 我的问题是树中有大量的节点和许多查询。是否有一种算法,它进行预处理,使查询能够在恒定的时间内得到答复。 我研究了使用RMQ的LCA,但我不能使用该技术,因为我不能对树中的这么多节点使用数组。 如果知道它是满二叉树,节点之间的关系如上所示,那么有人能给我一个高效的实现来快速回答许多查询。 但是当有很多查询时,这种算法非常耗时,因为在最坏的情况下,我可能必须遍历30的高度(树的最大高度)才能到达根(最

  • 问题内容: 我知道这是在黑暗中拍摄的,但是有没有办法仅使用CSS,CSS2,没有jquery,没有javascript来选择和设置元素祖先的样式?我已经遍历了选择器,但是发布了它,以防万一我错过了一些东西或者有一个聪明的解决方法。 例如,假设我有一个嵌套在div中的类名称为“ test”的表。是否有某种: 问题答案: CSS2或CSS3中没有父选择器之类的东西。实际上,可能永远不会存在,因为一旦开

  • 在顶级“foo”的范围内找到具有类“bar”的div,其祖先没有类“foo”。例如,

  • 问题内容: 这让我发疯: HTML: CSS: 这不是读到“选择所有祖先不是元素的元素吗?”。因此,“ Hello World!” 不应显示为红色,但仍然是。 对于上述标记,添加子组合器的工作原理是: 但是,如果它不是元素的子元素,则不会影响元素。例如: 这就是为什么我想将元素表示为元素的后代而不是子元素。任何人? 问题答案: 这不是读到“选择所有祖先不是元素的元素吗?”。 是的 但是在一个典型的

  • 问题内容: 我正在使用我的帐户运行此简单示例,但该示例无法正常工作并给出以下错误: 这是我的代码 问题答案: 您可能正在尝试使用端口25上的Gmail服务器通过未经身份验证的连接将邮件传递给第三方。Gmail不允许您这样做,因为这样 任何人 都可以使用Gmail的服务器将邮件发送给其他任何人。这称为 开放中继 ,在早期是垃圾邮件的常见促成因素。Internet上不再接受开放中继。 您将需要让SMT