The answer to your question depends entirely on whether or not you think you can trust CanUserDeleteRows
to do the right thing. Can you? Have you played around with it, observed its behavior, and determined that it does what it says on the tin? There's no "right" or "wrong" or "best" way here; you have to do the thing you can live with.
For example, I would never suggest that you use this behavior to avoid validating a public API. The principle for public API's is "Never trust the client." Ergo, you still validate on the API side, even if the data grid's behavior is solid.
As to the question in your title, I'm not sure why you think this behavior is an MVVM violation. The purpose of CanUserDeleteRows
is to inhibit the deletion of a row from the data grid, and that's all it does. Preventing a record from being deleted from a data grid is entirely a UI concern. That this also prevents a record from being removed from the underlying data-bound collection is a useful benefit of MVVM, and it's by design.
If you're looking for guarantees, there aren't any. As good as WPF is, I've still had to do many things that most people would consider workarounds. Is it still worth it? I think it is.