为什么MvvmLight.Command _and_ MvvmLight.Extras.WP7都需要?

时间:2011-01-19 21:11:26

标签: silverlight xaml windows-phone-7 mvvm-light

我有(注意Extras.WP7):

<phone:PhoneApplicationPage
  xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WP7"
>

...它对我的EventToCommand工作正常:

<phone:PhoneApplicationPage.Resources>
    <i:EventTrigger x:Key="KeyPadButtonTrigger" EventName="Click">
        <cmd:EventToCommand Command="{Binding Path=KeyPadButtonCommand}" CommandParameter="{Binding ElementName=Self, Path=Content }" />
    </i:EventTrigger>
</phone:PhoneApplicationPage.Resources>

但后来我想像这样使用MmvmLight的ButtonBaseExtensions

<Button  x:Name="button1" 
  cmd:ButtonBaseExtensions.Command="{Binding KeyPadButtonCommand}" 
  cmd:ButtonBaseExtensions.CommandParameter="{Binding ElementName=button1, Path=Content }"/>

...但是当我这样做时,我遇到了"The attachable property 'Command' was not found in type 'ButtonBaseExtensions'"个错误。

我发现我必须为assembly=GalaSoft.MvvmLight.WP7添加名称空间,如下所示:

<phone:PhoneApplicationPage
  xmlns:cmdxtras="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WP7"
  xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.WP7"
>

请注意,我有两个xmlns:cmdxtrasxmlns:cmd。如果我只有一个或那个,事情就不起作用了!

这看起来非常笨拙,并没有与我认为别人的建议相提并论。为什么我需要两者?

2 个答案:

答案 0 :(得分:5)

Extras程序集的存在是因为EventToCommand需要对System.Windows.Interactivity的引用,而ButtonBaseExtensions,RelayCommand,Messenger等不需要它。有些人不愿意添加对程序集的引用,如果他们可以避免它。因此对于那些不需要EventtoCommand的人来说,他们使用基本程序集,而其他想要整个程序的人可以添加额外的程序。

干杯, 劳伦

答案 1 :(得分:1)

MvvmLight.Extras.WP7程序集提供了一个特定于WP7的程序集,其中包含“Extras”,即您可能想要或可能不想使用的那些内容,其中包括EventToCommand。 MvvmLight.WP7程序集是WP7特定的程序集,它提供核心功能,包括ButtonBaseExtensions。恰巧在您的场景中,两个类都位于相同的命名空间中,因为它们都与命令相关。遗憾的是,.NET Framework没有提供从两个不同程序集引用相同名称空间的机制,因此需要进行重复的xmlns定义。

从长远来看,可以在this MSDN article中描述的两个程序集中使用XmlnsDefinitionAttribute和XmlnsPrefixAttribute,它们允许相同的xmlns和前缀与两个程序集中的相同名称空间相关联,但这是一个决定对于Laurent来说,或者是为项目提供的贡献者:)