好的,所以情况是我在ResourceDictionary(Styles.xaml)中为ListBox定义了一个ItemTemplate。 ListBoxItem模板看起来像这样:
<ControlTemplate TargetType="ListBoxItem">
<Button Command="{Binding Path=DoSomeCommand}" Content="Test" />
</ControlTemplate>
现在无论在哪里使用这个模板,我都想让这个按钮单击绑定到可用的ViewModel命令来处理它。
然而,这不起作用,我也试过了:
<ControlTemplate TargetType="ListBoxItem">
<Button Command="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DoSomeCommand}" Content="Test" />
</ControlTemplate>
但仍然没有骰子。
一个可行的简单示例是,如果您在使用它的控件(资源)中定义模板,并且只使用事件处理程序(所有生成的XAML都使用相同的处理程序。
有关实现此目标的最佳方法的任何想法或想法?我认为这必须是一个常见的场景:目标只是允许用户与ListBox中的项目进行交互。
谢谢!
答案 0 :(得分:1)
好的,我想我回答了自己的问题:
解决方案似乎是在这里使用'嵌套'ViewModels :
换句话说,不是让我的ListBox直接绑定到DTO /业务对象的集合(正如我上面所做的那样),而是创建了一个简单的ViewModel来包装每个DTO,并在 it <上执行命令/ em>,而不是原始的顶级VM。
所以绑定集合现在看起来像这样:
TestItems = new ObservableCollection<ItemVM> ()
{
new ItemVM(),
new ItemVM(),
new ItemVM()
};
每个ItemVM只包装DTO,并具有命令:
public class ItemVM : INotifyPropertyChanged
{
public ItemVM ()
{
this.MyCommand = new DelegateCommand<string> ( TheCommand );
}
public ICommand MyCommand { get; private set; }
public MyBusinessObject BizObj;
}
瞧,不需要RelativeSource,我们有一个带有命令的可重用模板。
答案 1 :(得分:0)
答案很长:Reference to a TextBox inside a DataTemplate
简答:使用Prism命令或混合行为。