0

我创建了一个基于 MVVM 轻量级工具包的 VM。在VM中,有一个简单的ICommand(RelayCommand)

  private RelayCommand _myCommand = null;
    public RelayCommand MyCommand
    {
        get
        {
            if (_myCommand == null)  //set break point here for debug
            {
                _myCommand = new RelayCommand(() =>
                {
                    try
                    {
                       //....
                    }
                    catch (Exception ex)
                    {
                        // notify user if there is any error
                        //....
                    }
                }
                , () => true);
            }
            return _myCommand;
        }
    }

然后在 xaml 中,只需将此 Command 属性绑定到一个按钮,例如:

 <Button Grid.Column="1"  x:Name="Test" Content="Test" Margin="2,0,2,0" Command="{Binding Path=MyCommand}" />

然后运行app,点击按钮,完全没有反应。没有错误。虚拟机工作正常。在单击“测试”按钮之前,数据已加载到数据网格中。

如果调试应用程序并放置断点,则永远不会到达该点。

如何解决这个问题?

4

4 回答 4

2

在我的机器上工作:)

说真的,我做了一个简单的项目,创建了一个 ViewModel,粘贴到你的代码中,它就可以工作了。我猜你正在处理其他问题。

这是我的 C# 代码。

这是我的 XAML 代码。

是时候传福音了

这个 ViewModel 代码很臭。您可能会考虑使用某种 MVVM 框架或助手。例如,如果您查看ViewModelSupport,您可以这样编写 ViewModel:

public class MyViewModel : ViewModelBase
{
    public void Execute_MyCommand()
    {
        // Your execution code here
    }
}

然后,您避免了所有那些凌乱的管道。考虑一下 :)

于 2010-07-21T02:18:54.047 回答
2

将设置器添加到您的 MyCommand 属性。

与往常一样,在呈现 XAML 时检查“输出”窗口是否存在任何数据绑定错误。

此外,尝试添加一个测试值转换器并在 convert 方法中放置一个断点,以查看是否在该命令上执行了数据绑定。如果未命中断点,则说明 XAML 中存在问题。如果断点被击中,请查看该值以查看数据上下文是否正确。

<UserControl.Resources>
    <ResourceDictionary>
        <TestConverter x:Key="TestConverter" />
    </ResourceDictionary>
    <Button Grid.Column="1" x:Name="Test" Content="Test" Margin="2,0,2,0" Command="{Binding Path=MyCommand, Converter={StaticResource TestConverter}}" />
</UserControl>

测试值转换器 - 对于调试数据绑定问题非常有用。

public class TestConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        Debug.WriteLine("TestConverter.Convert(value := {0}, targetType := {1}, parameter := {2}, culture := {3})",
            value, targetType, parameter, culture);
        return value; // put break point here to test data binding
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        Debug.WriteLine("TestConverter.ConvertBack(value := {0}, targetType := {1}, parameter := {2}, culture := {3})",
            value, targetType, parameter, culture);
        return value;
    }
}
于 2010-07-20T15:52:46.357 回答
0

代码看起来不错。所以你只需要检查输出窗口是否有数据绑定错误。也许您没有正确设置视图的数据上下文。顺便说一句,您应该在命令的 try-catch 中添加断点。

于 2010-07-21T09:13:03.440 回答
0

1)确保您true从中继命令的CanExecute代表返回。(我看到你正在这样做,但最好仔细检查)。

2) 里面的按钮是ListBox,DataGrid还是DataForm?

对于 ListBox 或 DataGrid:

如果是这样,您需要修改绑定表达式以引用 VM DataContext 而不是数据绑定项。看到这个答案

对于 DataForm :

更棘手,但看看这个问题。

于 2010-07-28T03:21:45.350 回答