WPF Button Command, why logic code in ViewModel?












0















I have read some thread about how to work on WPF ListView command binding.



Passing a parameter using RelayCommand defined in the ViewModel
Binding Button click to a method
Button Command in WPF MVVM Model
How to bind buttons in ListView DataTemplate to Commands in ViewModel?



All of them suggest write the logic code inside ViewModel class, for example:



  public RelayCommand ACommandWithAParameter
{
get
{
if (_aCommandWithAParameter == null)
{
_aCommandWithAParameter = new RelayCommand(
param => this.CommandWithAParameter("Apple")
);
}

return _aCommandWithAParameter;
}
}

public void CommandWithAParameter(String aParameter)
{
String theParameter = aParameter;
}


It is good practice or anyway so I can move the CommandWithAParameter() out of the ViewModel?










share|improve this question























  • Possible duplicate of Why RelayCommand

    – Rekshino
    Jan 3 at 7:23











  • Do you want to move it into Code Behind (View) or into the Model?

    – Daniel W.
    Jan 3 at 7:54











  • Since my concept come from winform and ASP.NET MVC world, I considering move to the view's code behind (MainWindow.xaml.cs), and ViewModel inherit the MainWindow class to execute the CommandWithAParameter(), however ViewModel inherit View seem not make sense. Maybe I create something like Service Layer like ASP.NET MVC is more elegant?

    – Cheung
    Jan 3 at 14:57
















0















I have read some thread about how to work on WPF ListView command binding.



Passing a parameter using RelayCommand defined in the ViewModel
Binding Button click to a method
Button Command in WPF MVVM Model
How to bind buttons in ListView DataTemplate to Commands in ViewModel?



All of them suggest write the logic code inside ViewModel class, for example:



  public RelayCommand ACommandWithAParameter
{
get
{
if (_aCommandWithAParameter == null)
{
_aCommandWithAParameter = new RelayCommand(
param => this.CommandWithAParameter("Apple")
);
}

return _aCommandWithAParameter;
}
}

public void CommandWithAParameter(String aParameter)
{
String theParameter = aParameter;
}


It is good practice or anyway so I can move the CommandWithAParameter() out of the ViewModel?










share|improve this question























  • Possible duplicate of Why RelayCommand

    – Rekshino
    Jan 3 at 7:23











  • Do you want to move it into Code Behind (View) or into the Model?

    – Daniel W.
    Jan 3 at 7:54











  • Since my concept come from winform and ASP.NET MVC world, I considering move to the view's code behind (MainWindow.xaml.cs), and ViewModel inherit the MainWindow class to execute the CommandWithAParameter(), however ViewModel inherit View seem not make sense. Maybe I create something like Service Layer like ASP.NET MVC is more elegant?

    – Cheung
    Jan 3 at 14:57














0












0








0








I have read some thread about how to work on WPF ListView command binding.



Passing a parameter using RelayCommand defined in the ViewModel
Binding Button click to a method
Button Command in WPF MVVM Model
How to bind buttons in ListView DataTemplate to Commands in ViewModel?



All of them suggest write the logic code inside ViewModel class, for example:



  public RelayCommand ACommandWithAParameter
{
get
{
if (_aCommandWithAParameter == null)
{
_aCommandWithAParameter = new RelayCommand(
param => this.CommandWithAParameter("Apple")
);
}

return _aCommandWithAParameter;
}
}

public void CommandWithAParameter(String aParameter)
{
String theParameter = aParameter;
}


It is good practice or anyway so I can move the CommandWithAParameter() out of the ViewModel?










share|improve this question














I have read some thread about how to work on WPF ListView command binding.



Passing a parameter using RelayCommand defined in the ViewModel
Binding Button click to a method
Button Command in WPF MVVM Model
How to bind buttons in ListView DataTemplate to Commands in ViewModel?



All of them suggest write the logic code inside ViewModel class, for example:



  public RelayCommand ACommandWithAParameter
{
get
{
if (_aCommandWithAParameter == null)
{
_aCommandWithAParameter = new RelayCommand(
param => this.CommandWithAParameter("Apple")
);
}

return _aCommandWithAParameter;
}
}

public void CommandWithAParameter(String aParameter)
{
String theParameter = aParameter;
}


It is good practice or anyway so I can move the CommandWithAParameter() out of the ViewModel?







wpf






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Jan 3 at 7:02









CheungCheung

7,049175587




7,049175587













  • Possible duplicate of Why RelayCommand

    – Rekshino
    Jan 3 at 7:23











  • Do you want to move it into Code Behind (View) or into the Model?

    – Daniel W.
    Jan 3 at 7:54











  • Since my concept come from winform and ASP.NET MVC world, I considering move to the view's code behind (MainWindow.xaml.cs), and ViewModel inherit the MainWindow class to execute the CommandWithAParameter(), however ViewModel inherit View seem not make sense. Maybe I create something like Service Layer like ASP.NET MVC is more elegant?

    – Cheung
    Jan 3 at 14:57



















  • Possible duplicate of Why RelayCommand

    – Rekshino
    Jan 3 at 7:23











  • Do you want to move it into Code Behind (View) or into the Model?

    – Daniel W.
    Jan 3 at 7:54











  • Since my concept come from winform and ASP.NET MVC world, I considering move to the view's code behind (MainWindow.xaml.cs), and ViewModel inherit the MainWindow class to execute the CommandWithAParameter(), however ViewModel inherit View seem not make sense. Maybe I create something like Service Layer like ASP.NET MVC is more elegant?

    – Cheung
    Jan 3 at 14:57

















Possible duplicate of Why RelayCommand

– Rekshino
Jan 3 at 7:23





Possible duplicate of Why RelayCommand

– Rekshino
Jan 3 at 7:23













Do you want to move it into Code Behind (View) or into the Model?

– Daniel W.
Jan 3 at 7:54





Do you want to move it into Code Behind (View) or into the Model?

– Daniel W.
Jan 3 at 7:54













Since my concept come from winform and ASP.NET MVC world, I considering move to the view's code behind (MainWindow.xaml.cs), and ViewModel inherit the MainWindow class to execute the CommandWithAParameter(), however ViewModel inherit View seem not make sense. Maybe I create something like Service Layer like ASP.NET MVC is more elegant?

– Cheung
Jan 3 at 14:57





Since my concept come from winform and ASP.NET MVC world, I considering move to the view's code behind (MainWindow.xaml.cs), and ViewModel inherit the MainWindow class to execute the CommandWithAParameter(), however ViewModel inherit View seem not make sense. Maybe I create something like Service Layer like ASP.NET MVC is more elegant?

– Cheung
Jan 3 at 14:57












1 Answer
1






active

oldest

votes


















1














In principle, MVVM application should be able to run to its full potential without creating the views. That's impossible, if some parts of your logic are in View classes.



On top of that, ICommand has CanExecute, which will autamagically disable buttons, menu items etc. if the command should not be run.



I understand why with basic RelayCommand implementation it can be hard to see the benefits, but take a look at ReactiveCommand samples.



ReactiveCommand handles async work very well, even disabling the button for the time work is done and enabling it afterwards.



Short example: you have a login form. You want to disable the login button if the username and password are empty.



Using commands, you just set CanExecute to false and it's done.



Using events, you have manualy disable/enable the button, remember that it has to be done in Dispatcher thread and so on - it gets very messy if you have 5 buttons depending on different properties.



As for ListView, commands are also usefull - you can bind current item as command parameter:



<ListView ItemsSource="{Binding MyObjects}">
<ListView.ItemTemplate>
<DataTemplate>
<DockPanel>
<!-- change the context to parent ViewModel and pass current element to the command -->
<Button DockPanel.Dock="Right" Command="{Binding ElementName=Root, Path=ViewModel.Delete}" CommandParameter="{Binding}">Delete</Button>

<TextBlock Text="{Binding Name}"/>
</DockPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>





share|improve this answer























    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54017715%2fwpf-button-command-why-logic-code-in-viewmodel%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    1














    In principle, MVVM application should be able to run to its full potential without creating the views. That's impossible, if some parts of your logic are in View classes.



    On top of that, ICommand has CanExecute, which will autamagically disable buttons, menu items etc. if the command should not be run.



    I understand why with basic RelayCommand implementation it can be hard to see the benefits, but take a look at ReactiveCommand samples.



    ReactiveCommand handles async work very well, even disabling the button for the time work is done and enabling it afterwards.



    Short example: you have a login form. You want to disable the login button if the username and password are empty.



    Using commands, you just set CanExecute to false and it's done.



    Using events, you have manualy disable/enable the button, remember that it has to be done in Dispatcher thread and so on - it gets very messy if you have 5 buttons depending on different properties.



    As for ListView, commands are also usefull - you can bind current item as command parameter:



    <ListView ItemsSource="{Binding MyObjects}">
    <ListView.ItemTemplate>
    <DataTemplate>
    <DockPanel>
    <!-- change the context to parent ViewModel and pass current element to the command -->
    <Button DockPanel.Dock="Right" Command="{Binding ElementName=Root, Path=ViewModel.Delete}" CommandParameter="{Binding}">Delete</Button>

    <TextBlock Text="{Binding Name}"/>
    </DockPanel>
    </DataTemplate>
    </ListView.ItemTemplate>
    </ListView>





    share|improve this answer




























      1














      In principle, MVVM application should be able to run to its full potential without creating the views. That's impossible, if some parts of your logic are in View classes.



      On top of that, ICommand has CanExecute, which will autamagically disable buttons, menu items etc. if the command should not be run.



      I understand why with basic RelayCommand implementation it can be hard to see the benefits, but take a look at ReactiveCommand samples.



      ReactiveCommand handles async work very well, even disabling the button for the time work is done and enabling it afterwards.



      Short example: you have a login form. You want to disable the login button if the username and password are empty.



      Using commands, you just set CanExecute to false and it's done.



      Using events, you have manualy disable/enable the button, remember that it has to be done in Dispatcher thread and so on - it gets very messy if you have 5 buttons depending on different properties.



      As for ListView, commands are also usefull - you can bind current item as command parameter:



      <ListView ItemsSource="{Binding MyObjects}">
      <ListView.ItemTemplate>
      <DataTemplate>
      <DockPanel>
      <!-- change the context to parent ViewModel and pass current element to the command -->
      <Button DockPanel.Dock="Right" Command="{Binding ElementName=Root, Path=ViewModel.Delete}" CommandParameter="{Binding}">Delete</Button>

      <TextBlock Text="{Binding Name}"/>
      </DockPanel>
      </DataTemplate>
      </ListView.ItemTemplate>
      </ListView>





      share|improve this answer


























        1












        1








        1







        In principle, MVVM application should be able to run to its full potential without creating the views. That's impossible, if some parts of your logic are in View classes.



        On top of that, ICommand has CanExecute, which will autamagically disable buttons, menu items etc. if the command should not be run.



        I understand why with basic RelayCommand implementation it can be hard to see the benefits, but take a look at ReactiveCommand samples.



        ReactiveCommand handles async work very well, even disabling the button for the time work is done and enabling it afterwards.



        Short example: you have a login form. You want to disable the login button if the username and password are empty.



        Using commands, you just set CanExecute to false and it's done.



        Using events, you have manualy disable/enable the button, remember that it has to be done in Dispatcher thread and so on - it gets very messy if you have 5 buttons depending on different properties.



        As for ListView, commands are also usefull - you can bind current item as command parameter:



        <ListView ItemsSource="{Binding MyObjects}">
        <ListView.ItemTemplate>
        <DataTemplate>
        <DockPanel>
        <!-- change the context to parent ViewModel and pass current element to the command -->
        <Button DockPanel.Dock="Right" Command="{Binding ElementName=Root, Path=ViewModel.Delete}" CommandParameter="{Binding}">Delete</Button>

        <TextBlock Text="{Binding Name}"/>
        </DockPanel>
        </DataTemplate>
        </ListView.ItemTemplate>
        </ListView>





        share|improve this answer













        In principle, MVVM application should be able to run to its full potential without creating the views. That's impossible, if some parts of your logic are in View classes.



        On top of that, ICommand has CanExecute, which will autamagically disable buttons, menu items etc. if the command should not be run.



        I understand why with basic RelayCommand implementation it can be hard to see the benefits, but take a look at ReactiveCommand samples.



        ReactiveCommand handles async work very well, even disabling the button for the time work is done and enabling it afterwards.



        Short example: you have a login form. You want to disable the login button if the username and password are empty.



        Using commands, you just set CanExecute to false and it's done.



        Using events, you have manualy disable/enable the button, remember that it has to be done in Dispatcher thread and so on - it gets very messy if you have 5 buttons depending on different properties.



        As for ListView, commands are also usefull - you can bind current item as command parameter:



        <ListView ItemsSource="{Binding MyObjects}">
        <ListView.ItemTemplate>
        <DataTemplate>
        <DockPanel>
        <!-- change the context to parent ViewModel and pass current element to the command -->
        <Button DockPanel.Dock="Right" Command="{Binding ElementName=Root, Path=ViewModel.Delete}" CommandParameter="{Binding}">Delete</Button>

        <TextBlock Text="{Binding Name}"/>
        </DockPanel>
        </DataTemplate>
        </ListView.ItemTemplate>
        </ListView>






        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Jan 3 at 8:36









        Krzysztof SkowronekKrzysztof Skowronek

        1,331519




        1,331519
































            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54017715%2fwpf-button-command-why-logic-code-in-viewmodel%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Angular Downloading a file using contenturl with Basic Authentication

            Olmecas

            Can't read property showImagePicker of undefined in react native iOS