4

我正在使用 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)。

还有其他方法吗?

提前感谢大家的帮助。

谢谢并恭祝安康

尼山特拉纳

4

4 回答 4

1

好的得到了为什么这不起作用的答案..因为这是silverlight中的一个已知问题。

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

于 2012-11-02T07:23:10.513 回答
1

谢谢你们的反馈!

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

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

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

谢谢并恭祝安康

尼山特拉纳

于 2012-11-02T03:37:09.180 回答
1

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

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

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

于 2012-10-29T03:41:05.113 回答
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)在视图中,您必须向按钮添加一个事件,然后通过信使发送消息。

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

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

于 2012-10-29T03:58:02.453 回答