WPF Commands---How to attach to ViewModel properly from View for logic?












0















I have seen quite a few different posts regarding this, but am still confused as to what the proper way to do this is. I am implementing RelayCommand and IRequireViewID to do things like call a WindowsManager class to close windows from the view where it doesn't need to know what window it is calling, etc.
However, situations that arise like this is where I am unsure how to implement things properly.



So basically I have a command in the viewModel where you click a button and I need to save data to a DB once this happens. How do I have the command in the View but then put the logic for this into the ViewModel? IE, basically the ViewModel would need to know when the Command is called. I mean I could always put a static method in the viewmodel and call it from the view but I am assuming that probably is not a good way to implement it, ie MyViewModel.RedValidation from the view.



RelayCommand Class



public class RelayCommand : ICommand
{
private Action commandTask;

public RelayCommand(Action commandToRun)
{
commandTask = commandToRun;
}

public bool CanExecute(object parameter)
{
return true;
}

public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
commandTask();
}
}


View



public ICommand ValidateRed
{
get => new RelayCommand(RedValidation);
}

private void RedValidation()
{
//SAVE Data To DB <----This should be in the ViewModel though right?

}


XAML:



    <Button Name="ValidateBtn" Style="{StaticResource mainButtons}" Content="Validate Email" Width="100" 
HorizontalAlignment="Left" Command="{Binding ValidateRed}"/>









share|improve this question

























  • In your example the only thing in the view, next to the UI, is the trigger. Which triggers the command on your viewmodel. The binding will let it know when it's called. Actually, the bliss is the other way around. The view doesn't know about the command, or what's been triggered. This is what separation of concerns is about. The view should only care about presentation, and the viewmodel provides whatever it needs.

    – Funk
    Nov 27 '18 at 19:25











  • "SAVE Data To DB" most definitely should not be in View or in ViewModel. it should be in a data-access layer

    – ASh
    Nov 27 '18 at 20:26
















0















I have seen quite a few different posts regarding this, but am still confused as to what the proper way to do this is. I am implementing RelayCommand and IRequireViewID to do things like call a WindowsManager class to close windows from the view where it doesn't need to know what window it is calling, etc.
However, situations that arise like this is where I am unsure how to implement things properly.



So basically I have a command in the viewModel where you click a button and I need to save data to a DB once this happens. How do I have the command in the View but then put the logic for this into the ViewModel? IE, basically the ViewModel would need to know when the Command is called. I mean I could always put a static method in the viewmodel and call it from the view but I am assuming that probably is not a good way to implement it, ie MyViewModel.RedValidation from the view.



RelayCommand Class



public class RelayCommand : ICommand
{
private Action commandTask;

public RelayCommand(Action commandToRun)
{
commandTask = commandToRun;
}

public bool CanExecute(object parameter)
{
return true;
}

public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
commandTask();
}
}


View



public ICommand ValidateRed
{
get => new RelayCommand(RedValidation);
}

private void RedValidation()
{
//SAVE Data To DB <----This should be in the ViewModel though right?

}


XAML:



    <Button Name="ValidateBtn" Style="{StaticResource mainButtons}" Content="Validate Email" Width="100" 
HorizontalAlignment="Left" Command="{Binding ValidateRed}"/>









share|improve this question

























  • In your example the only thing in the view, next to the UI, is the trigger. Which triggers the command on your viewmodel. The binding will let it know when it's called. Actually, the bliss is the other way around. The view doesn't know about the command, or what's been triggered. This is what separation of concerns is about. The view should only care about presentation, and the viewmodel provides whatever it needs.

    – Funk
    Nov 27 '18 at 19:25











  • "SAVE Data To DB" most definitely should not be in View or in ViewModel. it should be in a data-access layer

    – ASh
    Nov 27 '18 at 20:26














0












0








0








I have seen quite a few different posts regarding this, but am still confused as to what the proper way to do this is. I am implementing RelayCommand and IRequireViewID to do things like call a WindowsManager class to close windows from the view where it doesn't need to know what window it is calling, etc.
However, situations that arise like this is where I am unsure how to implement things properly.



So basically I have a command in the viewModel where you click a button and I need to save data to a DB once this happens. How do I have the command in the View but then put the logic for this into the ViewModel? IE, basically the ViewModel would need to know when the Command is called. I mean I could always put a static method in the viewmodel and call it from the view but I am assuming that probably is not a good way to implement it, ie MyViewModel.RedValidation from the view.



RelayCommand Class



public class RelayCommand : ICommand
{
private Action commandTask;

public RelayCommand(Action commandToRun)
{
commandTask = commandToRun;
}

public bool CanExecute(object parameter)
{
return true;
}

public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
commandTask();
}
}


View



public ICommand ValidateRed
{
get => new RelayCommand(RedValidation);
}

private void RedValidation()
{
//SAVE Data To DB <----This should be in the ViewModel though right?

}


XAML:



    <Button Name="ValidateBtn" Style="{StaticResource mainButtons}" Content="Validate Email" Width="100" 
HorizontalAlignment="Left" Command="{Binding ValidateRed}"/>









share|improve this question
















I have seen quite a few different posts regarding this, but am still confused as to what the proper way to do this is. I am implementing RelayCommand and IRequireViewID to do things like call a WindowsManager class to close windows from the view where it doesn't need to know what window it is calling, etc.
However, situations that arise like this is where I am unsure how to implement things properly.



So basically I have a command in the viewModel where you click a button and I need to save data to a DB once this happens. How do I have the command in the View but then put the logic for this into the ViewModel? IE, basically the ViewModel would need to know when the Command is called. I mean I could always put a static method in the viewmodel and call it from the view but I am assuming that probably is not a good way to implement it, ie MyViewModel.RedValidation from the view.



RelayCommand Class



public class RelayCommand : ICommand
{
private Action commandTask;

public RelayCommand(Action commandToRun)
{
commandTask = commandToRun;
}

public bool CanExecute(object parameter)
{
return true;
}

public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
commandTask();
}
}


View



public ICommand ValidateRed
{
get => new RelayCommand(RedValidation);
}

private void RedValidation()
{
//SAVE Data To DB <----This should be in the ViewModel though right?

}


XAML:



    <Button Name="ValidateBtn" Style="{StaticResource mainButtons}" Content="Validate Email" Width="100" 
HorizontalAlignment="Left" Command="{Binding ValidateRed}"/>






c# wpf mvvm command viewmodel






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 27 '18 at 17:49







MattE

















asked Nov 27 '18 at 17:45









MattEMattE

343517




343517













  • In your example the only thing in the view, next to the UI, is the trigger. Which triggers the command on your viewmodel. The binding will let it know when it's called. Actually, the bliss is the other way around. The view doesn't know about the command, or what's been triggered. This is what separation of concerns is about. The view should only care about presentation, and the viewmodel provides whatever it needs.

    – Funk
    Nov 27 '18 at 19:25











  • "SAVE Data To DB" most definitely should not be in View or in ViewModel. it should be in a data-access layer

    – ASh
    Nov 27 '18 at 20:26



















  • In your example the only thing in the view, next to the UI, is the trigger. Which triggers the command on your viewmodel. The binding will let it know when it's called. Actually, the bliss is the other way around. The view doesn't know about the command, or what's been triggered. This is what separation of concerns is about. The view should only care about presentation, and the viewmodel provides whatever it needs.

    – Funk
    Nov 27 '18 at 19:25











  • "SAVE Data To DB" most definitely should not be in View or in ViewModel. it should be in a data-access layer

    – ASh
    Nov 27 '18 at 20:26

















In your example the only thing in the view, next to the UI, is the trigger. Which triggers the command on your viewmodel. The binding will let it know when it's called. Actually, the bliss is the other way around. The view doesn't know about the command, or what's been triggered. This is what separation of concerns is about. The view should only care about presentation, and the viewmodel provides whatever it needs.

– Funk
Nov 27 '18 at 19:25





In your example the only thing in the view, next to the UI, is the trigger. Which triggers the command on your viewmodel. The binding will let it know when it's called. Actually, the bliss is the other way around. The view doesn't know about the command, or what's been triggered. This is what separation of concerns is about. The view should only care about presentation, and the viewmodel provides whatever it needs.

– Funk
Nov 27 '18 at 19:25













"SAVE Data To DB" most definitely should not be in View or in ViewModel. it should be in a data-access layer

– ASh
Nov 27 '18 at 20:26





"SAVE Data To DB" most definitely should not be in View or in ViewModel. it should be in a data-access layer

– ASh
Nov 27 '18 at 20:26












1 Answer
1






active

oldest

votes


















1














Everything you have in "View" should be in "ViewModel". Commands are properties of the view model, not the view (also, you shouldn't be binding against the view 99% of the time).



Once you have changed that, it should fall into place the way you expect.






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%2f53505313%2fwpf-commands-how-to-attach-to-viewmodel-properly-from-view-for-logic%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














    Everything you have in "View" should be in "ViewModel". Commands are properties of the view model, not the view (also, you shouldn't be binding against the view 99% of the time).



    Once you have changed that, it should fall into place the way you expect.






    share|improve this answer




























      1














      Everything you have in "View" should be in "ViewModel". Commands are properties of the view model, not the view (also, you shouldn't be binding against the view 99% of the time).



      Once you have changed that, it should fall into place the way you expect.






      share|improve this answer


























        1












        1








        1







        Everything you have in "View" should be in "ViewModel". Commands are properties of the view model, not the view (also, you shouldn't be binding against the view 99% of the time).



        Once you have changed that, it should fall into place the way you expect.






        share|improve this answer













        Everything you have in "View" should be in "ViewModel". Commands are properties of the view model, not the view (also, you shouldn't be binding against the view 99% of the time).



        Once you have changed that, it should fall into place the way you expect.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 27 '18 at 17:48









        BradleyDotNETBradleyDotNET

        52k87190




        52k87190
































            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%2f53505313%2fwpf-commands-how-to-attach-to-viewmodel-properly-from-view-for-logic%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

            A CLEAN and SIMPLE way to add appendices to Table of Contents and bookmarks

            Calculate evaluation metrics using cross_val_predict sklearn

            Insert data from modal to MySQL (multiple modal on website)