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}" />

次に、アプリを実行してボタンをクリックしますが、まったく応答がありません。エラーなし。VM は正常に動作しています。[テスト] ボタンをクリックする前に、データがデータグリッドに読み込まれています。

アプリをデバッグしてブレークポイントを配置すると、ポイントに到達しません。

この問題を解決するにはどうすればよいですか?

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

true1)リレー コマンドのCanExecuteデリゲートから戻っていることを確認します。(私はあなたがこれをやっているのを見ますが、再確認するのは良いことです).

2) ボタンは 、または の中にありListBoxますDataGridDataForm?

ListBox または DataGrid の場合:

その場合は、バインディング式を変更して、データバインドされたアイテムではなく VM DataContext を参照する必要があります。この回答を参照してください

DataForm の場合:

もっとトリッキーですが、この質問を見てください。

于 2010-07-28T03:21:45.350 に答える
0

コードは問題ないようです。そのため、出力ウィンドウでデータバインディング エラーを確認するだけです。ビューのデータコンテキストを正しく設定していない可能性があります。ところで、コマンドの try-catch にブレークポイントを追加する必要があります。

于 2010-07-21T09:13:03.440 に答える