public static void BindFlagInput <T>(this Element self, BindFlagInputOptions <T> options) where T : class, INotifyPropertyChanged { var source = options.BindObject ?? throw new ArgumentNullException(nameof(options.BindObject)); var property = options.Property ?? throw new ArgumentNullException(nameof(options.Property)); if (property.Body is not MemberExpression) { throw new ArgumentException(Resources.InvalidBindingExpression); } var attribute = options.Attribute; if (string.IsNullOrWhiteSpace(attribute)) { throw new ArgumentException("Attribute cannot be empty"); } attribute = attribute.ToLowerInvariant(); var setter = CompileSetter(property); var getter = property.Compile(); self.Bind(source, _ => { var value = getter(source); self.ToggleAttributeLower(attribute, value); }); self.BindBack(_ => { var value = self.HasAttributeLower(attribute); setter(source, value); }); }
/// <summary> /// Adds a two-way binding for a flag attribute (e.g. 'checked' attribute) /// </summary> /// <typeparam name="T">Type of data source</typeparam> /// <param name="options">Binding options</param> /// <returns>This instance</returns> public LaraBuilder BindFlagInput <T>(BindFlagInputOptions <T> options) where T : class, INotifyPropertyChanged { _stack.Peek().BindFlagInput(options); return(this); }