How to hookup TextBox's TextChanged event and Command in order to use MVVM pattern in Silverlight

前端 未结 10 2395
一整个雨季
一整个雨季 2020-12-15 18:19

Recently, I realized that MVVM pattern is so useful for Silverlight application and studying how to adopt it into my project.

BTW, how to hook up the textbox\'s text

10条回答
  •  生来不讨喜
    2020-12-15 18:38

    For the sake of conversation, lets say that you do need to hook up some arbitrary event to a Command rather than bind directly to a property on the ViewModel (due to a lack of support in the control or framework, defect, etc.) This can be done in the codebehind. Contrary to some misconceptions, MVVM does not preclude codebehind. It is just important to remember that the logic in the codebehind should not cross layers - it should be relate directly to the UI and the specific UI technology being used. (Note however, that putting 95% of your work in the markup file may make it a little unintutitive to have some functionality in the codebehind, so a comment or two in the markup about this one-off codebehind implementation may make things easier down the road for yourself or others.)

    There are usually 2 parts to binding a command in codebehind. First, you have to respond to the event. Second, you (may) want to tie into the command's CanExecute property.

    // Execute the command from the codebehind
    private void HandleTheEvent(Object sender, EventArgs e)
    {
        var viewModel = DataContext as ViewModel;
        if (viewModel != null)
        {
            var command = viewModel.SomeCommand;
            command.Execute(null);
        }
    }
    
    // Listen for the command's CanExecuteChanged event
    // Remember to call this (and unhook events as well) whenever the ViewModel instance changes
    private void ListenToCommandEvent()
    {
        var viewModel = DataContext as ViewModel;
        if (viewModel != null)
        {
            var command = viewModel.SomeCommand;
            command.CanExecuteChanged += (o, e) => EnableOrDisableControl(command.CanExecute(null));
        }
    }
    

提交回复
热议问题