【问题标题】:MVVM Light - Relay Command Parameter value coming intermittentlyMVVM Light - 继电器命令参数值间歇性出现
【发布时间】:2012-10-29 03:17:39
【问题描述】:

我正在使用 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。时不时地,我看到 value 是应该的精确值(例如 75.0)。

还有其他方法吗?

提前感谢大家的帮助。

感谢和问候

尼桑特拉纳

【问题讨论】:

    标签: wpf silverlight mvvm-light


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      是的,至少有另一个人可以做到这一点。从您的示例来看,使用 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) 您可以在 ViewModel 的析构函数中Unregister 订阅,以防止发送多条消息。

      【讨论】:

      • 使用按钮的默认“点击”事件,与命令相比不会是一个昂贵的调用吗?但是,在我看来,命令参数可以更优雅地为当前情况服务,不是吗?如果我的理解有误,请纠正我?问候 Nishant
      • 我从未测试过点击事件与命令绑定相比的性能。我预计它们会有非常细微的差异,如果您对它们进行一百万次负载测试,可能只有 1 或 2 秒。在我看来,测试或担心这一点是没有意义的。
      • 是的,确实在性能上没有太大差异,但仍然建议使用命令代替,因为如果我们不正确处理它们,它们甚至没有像事件可能导致的内存泄漏危险..我考虑将其分享为知识共享 :-) 但是,您建议的解决方案也是一种优雅的方式,可用于更复杂的情况。再次感谢您的反馈和帮助!
      【解决方案3】:

      感谢大家的反馈!

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

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

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

      感谢和问候

      尼桑特拉纳

      【讨论】:

        【解决方案4】:

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

        阅读this 链接以获取来自 MSFT 的详细信息。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-17
          • 1970-01-01
          • 1970-01-01
          • 2011-09-27
          • 2015-02-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多