如何在ResourceDictionary(Styles.xaml)中将Silverlight ListItem DataTemplate中的Button与处理程序连接?

时间:2010-01-22 15:45:34

标签: silverlight xaml

好的,所以情况是我在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中的项目进行交互。

谢谢!

2 个答案:

答案 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命令或混合行为。