我正在使用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
答案 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的详细信息。