Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
InvalidOperationException: Adding or removing event handlers dynamically is not supported on WinRT events.using System;
using System.Reactive.Linq;
using System.Reflection;
using Windows.UI.Interactivity;
using Windows.UI.Xaml;
namespace WindowsRTExample
{
public class DependecyPropertyBehavior : Behavior<FrameworkElement>
{
private PropertyInfo _propertyInfo;
public static readonly DependencyProperty BindingProperty = DependencyProperty.Register(
"Binding",
typeof(object),
typeof(DependecyPropertyBehavior),
new PropertyMetadata(null, PropertyChangedCallback)
);
public object Binding
{
get { return GetValue(BindingProperty); }
set { SetValue(BindingProperty, value); }
}
public string Property { get; set; }
public string UpdateEvent { get; set; }
protected override void OnAttached()
{
if (Property == null) return;
_propertyInfo = AssociatedObject.GetType().GetTypeInfo().GetDeclaredProperty(Property);
if (_propertyInfo == null) return;
if (UpdateEvent == null) return;
var eventInfo = Observable.FromEventPattern<RoutedEventArgs>(AssociatedObject, UpdateEvent);
if (eventInfo == null) return;
eventInfo.Subscribe(ep => EventFired());
}
private static void PropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
var behavior = (DependecyPropertyBehavior)sender;
PropertyInfo property = behavior.AssociatedObject.GetType().GetTypeInfo().GetDeclaredProperty(behavior.Property);
if (property == null) return;
object oldValue = property.GetValue(behavior.AssociatedObject);
if (oldValue == null && e.NewValue == null) return;
if (oldValue != null && oldValue.Equals(e.NewValue)) return;
property.SetValue(behavior.AssociatedObject, e.NewValue);
}
private void EventFired()
{
Binding = _propertyInfo.GetValue(AssociatedObject, null);
}
}
}
Привязка для свойств отличных от свойств зависимостей
Keeping your password in plain text on the client machine RAM is a security no-noНо он не говорит почему это так важно. Если есть доступ к RAM, то машина уже скомпроментирована, разве нет?
Тем не менее, часто приходится писать не разметку, а код, который помогает первой работать как надо. Хотелось бы этого избегать и писать чистый XAML, но до сих пор ни одно мое приложение сложнее простого не обходилось без различных хелперов (классов-помощников), написанных на C#. К счастью, есть распространенные случаи, где можно одним хелпером решить сразу группу проблем.
Обсуждение на ЛОРе «Какие ассоциации вызывает у вас Linux»:
xxx: большой костыль, созданный из миллиардов маленьких костылей подпирающих один другого. костыль свободно парит в невесомости.
WPF: Что делать, когда свойство не поддерживает привязку