microsoft / microsoft-ui-xaml

Windows UI Library: the latest Windows 10 native controls and Fluent styles for your applications
MIT License
6.33k stars 675 forks source link

Proposal: Support DependencyPropertyKey and RegisterReadOnly as in WPF #3139

Open robloo opened 4 years ago

robloo commented 4 years ago

Proposal: Support DependencyPropertyKey and RegisterReadOnly as in WPF

Summary

Support is needed for read-only dependencies properties in UWP/WinUI. This is especially true for collection-type properties backed by a list that shouldn't be changed through the binding system. It will also allow several existing properties to be updated to support binding and MVVM (which is important in several application-specific scenarios).

private static readonly DependencyPropertyKey ReadOnlyPropPropertyKey =
    DependencyProperty.RegisterReadOnly(...);

public static readonly DependencyProperty ReadOnlyPropProperty =
    ReadOnlyPropPropertyKey.DependencyProperty;

public object ReadOnlyProp
{
    get { return GetValue(ReadOnlyPropProperty); }
    protected set { SetValue(ReadOnlyPropPropertyKey, value); }
}

Rationale

This is needed several places (examples listed below) and has been a rather large architectural gap since UWP inception as compared to WPF.

Scope

Capability Priority
Add DependencyPropertyKey Must
Add DependencyProperty.RegisterReadOnly Must

Important Notes

Switching to using read-only DPs in existing controls would be a binary breaking change but as the property accessors could be the same it would be minor. It would just enable binding.

Also see the discussions here:

chrisglein commented 4 years ago

@MikeHillberg Can you help me understand the tradeoff between RegisterReadOnly versus a OneWay binding? Is the value here that you can't do a TwoWay binding because it's captured by the DependencyProperty itself?

MikeHillberg commented 4 years ago

You can't do a TwoWay binding, nor set it from a Style Setter or VisualState, nor can you call the property setter explicitly from code. Without this feature you can still simply not have a property setter, but that doesn't affect the mechanisms that set the DP directly.

michael-hawker commented 2 years ago

This is needed for controls and library authors mostly I believe. For instance the WPF docs site an IsMouseOver property or maybe with a StateTrigger you have a IsActive property where you want other UI elements/bindings to observe that state and react to it, but not be able to manipulate it still.

robloo commented 1 year ago

Needed