1.常用页面button直接绑定command,触发viewModel中的指定cmd:
绑定方式:Command="{Binding ViewCmd}"
2.在listbox中添加了button按钮:
当直接绑定Command="{Binding ViewCmd}"是点击按钮,不会触发ViewModel中的ViewCmd,
需要相对源的绑定:Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ListBox}, Path=DataContext.GetBtnTextCmd}"
Command=
: 这个属性用于将按钮的命令与 ViewModel 中的一个 ICommand 属性进行绑定。Binding
: 这个关键字表示要进行数据绑定。RelativeSource
: 这个属性指定了绑定源对象的相对位置。FindAncestor
: 这个值表示要在视觉树中向上查找,以找到一个指定类型的父级元素。AncestorType=ListBox
: 这个值表示要查找 ListBox 类型的父级元素。Path=DataContext.GetBtnTextCmd
: 这个值表示要绑定的属性路径。它指定了要从 ListBox 的 DataContext(即 ViewModel)中获取的 ICommand 属性的名称。
两者间的区别:
-
Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ListBox}, Path=DataContext.GetBtnTextCmd}"
是在 ListBox 控件内部的 Button 按钮中进行的数据绑定。它会将按钮的命令与 ListBox 控件的父级元素(即 ViewModel)中的 GetBtnTextCmd 属性进行绑定,这样按钮被点击时,会调用 GetBtnTextCmd 命令所在 ViewModel 中的相应方法。 -
Command="{Binding LoadRepeatViewCmd}"
是在某个元素(例如 Button、MenuItem 等)的属性中进行的数据绑定。它会将该元素的命令与当前元素所在的 DataContext(即 ViewModel)中的 LoadRepeatViewCmd 属性进行绑定,这样当该元素被点击时,会调用 LoadRepeatViewCmd 命令所在 ViewModel 中的相应方法。
因此,两者的主要区别在于绑定的对象不同。第一个绑定是在 ListBox 中的 Button 中进行的,而第二个绑定是在某个元素的属性中进行的。另外,第一个绑定使用了相对源绑定,以便查找 ListBox 的 DataContext,而第二个绑定没有使用相对源绑定,因此默认使用的是当前元素所在的 DataContext。