Pushing read-only GUI properties back into ViewModel

后端 未结 6 1878
攒了一身酷
攒了一身酷 2020-11-22 12:50

I want to write a ViewModel that always knows the current state of some read-only dependency properties from the View.

Specifically, my GUI contains a FlowDocumentPa

6条回答
  •  爱一瞬间的悲伤
    2020-11-22 13:36

    I think it can be done a bit simpler:

    xaml:

    behavior:ReadOnlyPropertyToModelBindingBehavior.ReadOnlyDependencyProperty="{Binding ActualWidth, RelativeSource={RelativeSource Self}}"
    behavior:ReadOnlyPropertyToModelBindingBehavior.ModelProperty="{Binding MyViewModelProperty}"
    

    cs:

    public class ReadOnlyPropertyToModelBindingBehavior
    {
      public static readonly DependencyProperty ReadOnlyDependencyPropertyProperty = DependencyProperty.RegisterAttached(
         "ReadOnlyDependencyProperty", 
         typeof(object), 
         typeof(ReadOnlyPropertyToModelBindingBehavior),
         new PropertyMetadata(OnReadOnlyDependencyPropertyPropertyChanged));
    
      public static void SetReadOnlyDependencyProperty(DependencyObject element, object value)
      {
         element.SetValue(ReadOnlyDependencyPropertyProperty, value);
      }
    
      public static object GetReadOnlyDependencyProperty(DependencyObject element)
      {
         return element.GetValue(ReadOnlyDependencyPropertyProperty);
      }
    
      private static void OnReadOnlyDependencyPropertyPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
      {
         SetModelProperty(obj, e.NewValue);
      }
    
    
      public static readonly DependencyProperty ModelPropertyProperty = DependencyProperty.RegisterAttached(
         "ModelProperty", 
         typeof(object), 
         typeof(ReadOnlyPropertyToModelBindingBehavior), 
         new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
    
      public static void SetModelProperty(DependencyObject element, object value)
      {
         element.SetValue(ModelPropertyProperty, value);
      }
    
      public static object GetModelProperty(DependencyObject element)
      {
         return element.GetValue(ModelPropertyProperty);
      }
    }
    

提交回复
热议问题