8

次のように、ViewModelでRelayCommandを作成できるかどうか疑問に思います。

public RelayCommand<IList<VectorViewModel>> MyCommand { get; set; }

ctor:

MyCommand = new RelayCommand<IList<VectorViewModel>>(DoSomething);

そして、XAMLの背後にあるコードから、選択した行をDataGridから取得し、それらをリストに入れます。

if (xamDatagridVector.SelectedItems.Records.Count >= 3)
{
                var list = new List<VectorViewModel>();
                foreach (DataRecord record in xamDatagridVector.SelectedItems.Records)
                {
                    list.Add((VectorViewModel)record.DataItem);
                }
}

この段階で、前に作成したRelayCommandを使用して、リストをViewModelに送り返したいと思います。コードでRelayCommandを作成し、それをViewModelのコマンドにバインドして起動することは可能でしょうか?

別の方法はありますか?もちろん、MVVM-Lightで弱い参照のMessengerクラスを使用することもできますが、基になるViewModelだけでなく、その呼び出しのすべてのサブスクライバーに送信されるのが気に入らない点があります(複数ある場合はMessengerを使用すると致命的です) TabControls内の同じビューのインスタンス)

誰かが私を続けるためのアイデアを持っていることを願っています、ありがとう、Kave

4

2 に答える 2

19

Execute次の結果を確認した後、コマンドのメソッドを呼び出すだけCanExecuteです。

var viewModel = (MyViewModel)DataContext;
if (viewModel.MyCommand.CanExecute(list))
    viewModel.MyCommand.Execute(list);
于 2010-11-09T18:21:48.077 に答える
0

また、私が遭遇したように、UI要素のDataContextがフォーム全体と異なる場合は、次のようにすることができます。

 private void TextBoxTextChanged(object sender, TextChangedEventArgs e)
    {
        var binding = ((TextBox)sender).GetBindingExpression(TextBox.TextProperty);
        binding.UpdateSource();

        var msg = String.Format("Migrator file selection updated to {0}", ((TextBox)sender).Text);
        var rowControl = UiHelpers.FindVisualParent<UserControl>((DependencyObject)sender); // get the     FileNameSettingsRow UserControl
        var form = UiHelpers.FindVisualParent<UserControl>((DependencyObject)rowControl);  // get the main form it is used on

        var viewModel = (UseCaseSettingsViewModel)form.DataContext;

        if (viewModel.UpdateFileInCollectionCommand.CanExecute(((TextBox)sender).Text))
            viewModel.UpdateFileInCollectionCommand.Execute(((TextBox)sender).Text);


        Messenger.Default.Send(new NotificationMessage(this, msg), Notifications.AppendSysMessageTextToken);

        // Tell the UseCaseSettingsViewModel to force an update and reload
        //Messenger.Default.Send(new NotificationMessage(this, ((TextBox)sender).Text), Notifications.FileSelectionChangedInternalToken);
    }

これにより、下位のUserControlが存在するUserControlのDataContextが検出されます。次に、前の回答に示されているように、楽しいことを実行します。この場合、従属ユーザーコントロールのテキストボックスを編集して、テキストが変更されたことを包括的なビューモデルに通知する必要がありました。

FindVisualParentはここから取得されることに注意してください>>>https://stackoverflow.com/questions/636383/wpf-ways-to-find-controls

于 2011-08-01T05:57:53.843 に答える