代码之家  ›  专栏  ›  技术社区  ›  Bobby

如何将Silverlight ListItem数据模板、ResourceDictionary(styles.xaml)中的按钮与处理程序连接?

  •  3
  • Bobby  · 技术社区  · 15 年前

    好的,现在的情况是我正在为ResourceDictionary(styles.xaml)中的列表框定义一个itemTemplate。ListBoxItem模板如下所示:

    <ControlTemplate TargetType="ListBoxItem">
        <Button Command="{Binding Path=DoSomeCommand}" Content="Test"  />
    </ControlTemplate>
    

    现在无论在哪里使用这个模板,我都希望让这个按钮的click绑定到一个可用的viewmodel命令来处理它。

    不过,这并不能正常工作,我也尝试过:

    <ControlTemplate TargetType="ListBoxItem">
        <Button Command="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DoSomeCommand}" Content="Test"  />
    </ControlTemplate>
    

    但仍然没有骰子。

    一个简单的例子是,如果您在使用模板的控件(资源)中定义模板,并且只使用事件处理程序(对所有生成的XAML都使用相同的处理程序)。

    关于实现这一目标的最佳方法有什么想法或想法吗?我认为这一定是一个常见的场景:目标只是允许用户与列表框中的项目进行交互。

    谢谢!

    2 回复  |  直到 15 年前
        1
  •  1
  •   Bobby    15 年前

    好吧,我想我回答了我自己的问题:

    解决方案似乎是 “嵌套”视图模型 在这里:

    换言之,我没有直接将列表框绑定到DTO/业务对象集合(正如我在上面所做的那样),而是创建了一个简单的视图模型来包装每个DTO,并启用命令 而不是原始的顶级虚拟机。

    因此绑定集合现在看起来如下:

        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;
    }
    

    Voila,不需要一个相对资源,我们有一个可重用的模板,包含命令。

        2
  •  0
  •   Community CDub    8 年前

    长回答: Reference to a TextBox inside a DataTemplate

    简短回答:使用棱镜命令或混合行为。

    推荐文章