Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2.8 KiB
2.8 KiB
MVVM
- Keep ViewModels focused on presentation state and commands.
- Do not put UI element references into ViewModels.
- Do not access
Window,UserControl,DispatcherObjector visual tree elements from ViewModels. - Avoid direct navigation, dialogs or message boxes from ViewModels without an abstraction when testability matters.
- Prefer explicit application services for navigation, dialogs and external interactions.
- Keep domain logic outside ViewModels.
- Do not use ViewModels as general-purpose service containers.
- Keep ViewModel dependencies minimal.
- Prefer immutable or readonly state where practical.
- Avoid duplicated derived state.
- Keep state transitions predictable.
Data Binding
- Prefer data binding over manual UI synchronization.
- Use strongly typed properties.
- Use appropriate binding modes.
- Prefer
OneWaywhen two-way updates are not required. - Use
TwoWayonly when the UI must modify the source. - Avoid unnecessary
UpdateSourceTrigger=PropertyChangedfor expensive operations. - Keep binding paths simple and stable.
- Avoid deeply nested binding paths.
- Do not hide broken bindings.
- Treat binding errors as real defects.
- Use
FallbackValueandTargetNullValueonly when they reflect intended behavior. - Avoid excessive converters.
- Prefer exposing correctly shaped state from the ViewModel over complex converter logic.
- Avoid
MultiBindingwhen simpler state modeling is clearer. - Do not put business logic into converters.
Property Change Notifications
- Implement property change notifications consistently.
- Avoid raising
PropertyChangedunnecessarily. - Raise notifications only when values actually change.
- Keep dependent property notifications explicit.
- Avoid hidden notification chains that are difficult to reason about.
- Prefer reusable base implementations only when they reduce duplication without obscuring behavior.
- Do not use reflection-based notification mechanisms unless there is a concrete benefit.
Dependency Properties
- Use dependency properties only when WPF property-system behavior is required.
- Do not use dependency properties as a replacement for normal CLR properties.
- Keep metadata and callbacks lightweight.
- Avoid expensive work in property-changed callbacks.
- Avoid callbacks with hidden side effects.
- Validate or coerce values only when the control contract requires it.
- Do not expose mutable default values in dependency property metadata.
Attached Properties and Behaviors
- Use attached properties and behaviors for reusable view-specific behavior.
- Do not use them to hide business logic.
- Keep behaviors focused and predictable.
- Clean up event handlers when behaviors are detached.
- Avoid global attached-property state.
- Prefer explicit behavior over complex XAML hacks.