MVVM Light - 中继命令间歇性地发出参数值

时间:2012-10-29 03:17:40

标签: wpf silverlight mvvm-light

我正在使用silverlight应用程序。尝试将按钮的单击命令绑定到ViewModel中的中继命令,并将一些参数传递给它。我的观点代码是:

<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作为命令参数的参数。我的ViewModel代码是:

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 Rana

4 个答案:

答案 0 :(得分:1)

我认为它正在从DataContext中提取“ActualWidth”的绑定值,这可能是ViewModel(其中ActualWidth不作为属性存在)。

这可能有用。您可以尝试设置“this.button.DataContext = this;”在视图代码的Loaded事件处理程序中。因此视图成为按钮的首选datacontext。未解析的绑定属性(如CRelayDecimal)仍应回退到ViewModel。

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

答案 1 :(得分:1)

是的,至少有另外一个这样做。在您的示例中,使用Command没有意义,因为您只想将View中的值发送到ViewModel。

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

1)注册ViewModel中的消息。我更喜欢在它的构造函数中执行此操作。您还必须添加一个方法来处理来自Messenger的回调。请注意"tokenId"用于确保您将邮件发送给打算订阅者。

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

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

2)在视图中,您必须向按钮添加一个事件,然后通过信使发送消息。

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

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

答案 2 :(得分:1)

感谢大家的反馈!

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

因此,我认为它只采用“ActualWidth”属性的初始化值。

让我做一些测试,然后我会回复你,获得更多结果。

谢谢和问候

Nishant Rana

答案 3 :(得分:1)

好的答案为什么这不起作用?因为它是Silverlight中的一个已知问题。

阅读this链接,了解MSFT的详细信息。