2012-10-29 28 views
4

我正在使用silverlight应用程序。尝试将按钮的单击命令绑定到ViewModel中的中继命令并将一些参数传递给它。代码为我的观点是:MVVM Light - 继电器命令间歇性地发送参数值

<Button x:Name="button" Content="Button" VerticalAlignment="Top" Margin="173,0,152,0"> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="Click"> 
       <i:InvokeCommandAction CommandParameter="{Binding ActualWidth, ElementName=button, Mode=TwoWay}" Command="{Binding CRelayDecimal, Mode=OneWay}"/> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
</Button> 

一个按钮传递它的ActualWidth作为命令参数的参数。我的视图模型的代码是:

public Page1() 
{ 
    InitializeComponent(); 
    CRelayDecimal = new RelayCommand<Object>(this.GetDecimal); 
} 

public RelayCommand<Object> CRelayDecimal { get; private set; } 

private void GetDecimal(Object Obj) 
{ 
    var value = (double)Obj; 
} 

现在,我看到这里的问题是,大多数时间传递的参数值,我收到的是0.0。间歇性地,我已经看到它的价值应该是精确的价值(如75.0)。

有没有其他方法可以做到这一点?

谢谢大家提前给予的帮助。

感谢和问候

NISHANT林蛙

回答

1

好得到了,为什么这是行不通的..答案,因为它是在Silverlight中的已知问题。

阅读this从MSFT获取详细信息的链接。

1

我认为这是拉动(其中ActualWidth的不存在,作为一个属性)从DataContext的,这是有可能的视图模型“ActualWidth的”结合价值。

这可能有效。你可以尝试设置“this.button.DataContext = this;”在视图代码的Loaded事件处理程序中。所以视图成为按钮的首选数据上下文。未解析的绑定属性(例如CRelayDecimal)仍应回退到ViewModel。

或者最简单的做法就是在视图代码的按钮上挂接一个普通的点击处理程序。视图代码将计算事件发送方的ActualWidth,并根据需要为模型发送RelayCommand。

1

是的,至少有另外一个这样做。从你的例子来看,使用Command是没有意义的,因为你只是想将一个值从View发送到ViewModel。

我建议你使用Messenger在View和ViewModel之间发送值。你需要做的是:

1)注册到您的ViewModel消息。我更喜欢在它的构造函数中这样做。您还必须添加一个方法来处理信使的回调。请注意,"tokenId"用于确保您将消息发送给打算用户。

Messenger.Default.Register<double>(this, YourMethodHere, "tokenId"); 

private void YourMethodHere(double value) 
{ 
    // do your work here 
} 

2)内部查看,你必须将事件添加到按钮,只需通过Messenger发送消息。

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    Messenger.Default.Send<double>(this.ActualWidth, "tokenId"); 
} 

3)您可以在Unregister在ViewModel的订阅新的析构函数,以防止多发的消息发送。

+0

使用按钮的默认'点击'事件,不会是一个昂贵的调用比较命令?然而,在我相信的命令参数可以更好地为目前的情况达到这个目的,不是吗? PLZ,如果我的理解错误,请纠正我? Registers Nishant – nishantcop

+0

我从来没有测试点击事件比较与命令绑定的性能。我希望他们有一个非常小的差别,如果你加载100万次测试它们,可能需要1到2秒。在我看来,测试或担心这一点是没有意义的。 – Ekk

+0

是的,真的没有性能上的巨大差异,但仍然建议使用命令,因为他们甚至没有内存泄漏危险,如事件可能会导致如果我们不正确处理它们..我想分享它作为知识共享:-)然而,您建议的解决方案也是一种优雅的方式,可用于更复杂的情况..再次感谢您的反馈和帮助! – nishantcop

1

感谢球员们的反馈意见!

我进一步调查,发现问题是由于我绑定到它的属性,即“ActualWidth”。如果我尝试将其绑定到属性“宽度”,那么它工作正常。

因此,我相信它只取得“ActualWidth”属性的初始值。

让我做一些更多的测试,然后我会回来给你更多的结果。

感谢和问候

NISHANT林蛙