【问题标题】:MVVM Light EventToCommand doesn't work inside WP7 Pivot DataTemplateMVVM Light EventToCommand 在 WP7 Pivot DataTemplate 中不起作用
【发布时间】:2010-10-29 12:03:44
【问题描述】:

我有一个很奇怪的问题。在我的 WP7 应用程序中,我在其中定义了一个枢轴控件和一个项目模板(或在资源中,我尝试了两种方式,但仍然是同样的问题)。在模板中,我有一个定义了 EventToCommand 的常规按钮(EventName="Click")。我在 Pivot 之外也有相同的复制粘贴按钮。问题是枢轴外面的按钮工作正常,但里面的按钮不起作用。实际上我已经注意到,我的枢轴内的任何命令都不起作用。我正在正确处理 ViewModel 中的命令,因为相同的按钮,但在枢轴之外工作得很好。 任何想法可能是什么问题?请帮忙。 提前致谢。 干杯。

附:我的代码非常标准,但以防万一:

    <controls:Pivot Grid.Row="0"
        x:Name="PivotControl"
        Title="{Binding ApplicationTitle}"                         
        ItemsSource="{Binding BlaBla}">

        <controls:Pivot.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                   <Button Content="Click Me">
                        <i:Interaction.Triggers>
                            <i:EventTrigger EventName="Click">
                                <cmd:EventToCommand Command="{Binding MyCommand, Mode=OneWay}" CommandParameterValue="Test"/>
                            </i:EventTrigger>
                        </i:Interaction.Triggers>
                    </Button>
           ...

以及 ViewModel 代码:

public RelayCommand<string> MyCommand
    {
        get;
        private set;
    }
//And in the constructor ...
MyCommand= new RelayCommand<string>((param) => HandleTheCommand(param));

...

再次感谢。

【问题讨论】:

    标签: silverlight windows-phone-7 command pivot mvvm-light


    【解决方案1】:

    因为您在控件的 ItemTemplate 中,所以您绑定到的 DataContext 不是您的 ViewModel。绑定 {Binding MyCommand, OneWay} 正在尝试在集合 BlaBla 的对象上查找属性 MyCommand。这是命令模式的限制之一,因为在 DataTemplates 中,您的 DataContext 通常不是您的 ViewModel。

    真的没有什么好的办法。您可以将命令包含在 BlaBla 集合中的对象中。您还可以调整自己的触发器,该触发器在 VisualTree 中搜索您的 ViewModel,然后通过反射而不是实际绑定来检索命令。

    【讨论】:

      【解决方案2】:

      silverlight / WP7 的问题是模板中没有继承数据上下文。在使用反射器深入研究 MVVM lite 代码库后,我发现有一个很好的技巧可以让它工作。基本上不是在原始场景中暴露 ICommand,而是暴露类型 Binding 的依赖属性。然后任何实体都可以绑定到此属性,因为 Binding 可以评估可视树中的数据上下文。然后创建一个可观察的绑定类,它基本上具有一个隐藏的附加属性,该属性绑定到来自 TriggerAction 类的依赖属性的绑定。现在你需要做两件事: 1. TriggerAction类中,如果Binding DP发生变化,更新ObservableBinding成员 2、在ObserableBinding类中,如果隐藏的DP发生变化,评估并存储新的值。

      我希望这也能解决你的问题。

      【讨论】:

        猜你喜欢
        • 2013-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-23
        • 1970-01-01
        • 2017-12-18
        • 2015-09-26
        相关资源
        最近更新 更多