2010-07-20 59 views
0

我创建了一个基于MVVM light toolkit的虚拟机。 在VM中,有一个简单的ICommand(RelayCommand)无法将虚拟机中的ICommand绑定到xaml中的按钮命令

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,只是这个命令属性绑定到像一个按钮:

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

然后运行该应用程序,并单击按钮,根本没有回应。没有错误。 虚拟机运行正常。在点击测试按钮之前,数据已经加载到数据网格。

如果调试应用程序并把中断点,永远不会达到这一点。

如何解决此问题?

回答

2

将一个setter添加到您的MyCommand属性中。

像往常一样,在渲染XAML时,请检查输出窗口是否有任何数据绑定错误。

另外,尝试添加一个测试值转换器并在转换方法中放置一个断点,以查看数据绑定是否正在该命令上执行。如果断点没有被打中,你知道你的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; 
    } 
} 
+1

只是为了澄清,制定者是没有必要的命令绑定工作。然而,二传手会很有用,所以你不必把所有那些混乱的代码放在一个吸气器里。呸! – 2010-07-21 02:21:09

+0

爱测试转换器的想法。更多相关(或完全不相关)的提示? – 2010-07-28 03:11:29

2

作品在我的机器:)

认真的,我做了一个简单的项目,创建一个视图模型,在你的代码粘贴,和它的工作。我猜你正在处理其他一些问题。

Here is my C# code.

Here is my XAML code.

时间传福音有点

此视图模型代码恶臭。您可能会考虑使用某种MVVM框架或帮助程序。如果你看一下ViewModelSupport,比如,你可以写你的视图模型是这样的:

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

然后,你避免一切杂乱的管道。只是想想:)

+0

我没有想到你在基本ViewModel类中做的一些事情。我特别喜欢DependentUpon属性。非常好! – 2010-07-21 12:47:31

0

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

0

1)确保你从中继命令的CanExecute委托人返回true。 (我看到你正在这样做,但很好地重复检查)。

2)是内部的ListBoxDataGridDataForm按钮?

对于ListBox或DataGrid中:

如果是这样你需要修改你的绑定表达式来指代VM的DataContext,而不是数据绑定物品。 See this answer

对于数据形:

更棘手,but look at this question.

相关问题