Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>I found a solution I can live with: I ported the CallMethodAction to 3.5 and wrote my own PropertyChangedTrigger. It's pretty simple to call a method inside the view via a PropertyChange in the viewmodel - Kids: don't try this at home. It's only for special scenarios! :D</p> <p>Find my code below:</p> <p>usage:</p> <pre><code>xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" &lt;i:Interaction.Triggers &gt; &lt;Framework:PropertyChangedTrigger Binding="{Binding StartTransition}" Value="True"&gt; &lt;Framework:CallMethodAction MethodName="ApplyTransition" /&gt; &lt;/Framework:PropertyChangedTrigger&gt; &lt;/i:Interaction.Triggers&gt; </code></pre> <p>PropertyChangedTrigger:</p> <pre><code>public class PropertyChangedTrigger : TriggerBase&lt;DependencyObject&gt; { public static readonly DependencyProperty BindingProperty = DependencyProperty.Register("Binding", typeof(object), typeof(PropertyChangedTrigger), new PropertyMetadata(new PropertyChangedCallback(OnBindingChanged))); public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(object), typeof(PropertyChangedTrigger), new PropertyMetadata(null)); public object Binding { get { return base.GetValue(BindingProperty); } set { base.SetValue(BindingProperty, value); } } public object Value { get { return base.GetValue(ValueProperty); } set { base.SetValue(ValueProperty, value); } } protected virtual void EvaluateBindingChange(object args) { var propertyChangedArgs = (DependencyPropertyChangedEventArgs)args; string newValue = propertyChangedArgs.NewValue.ToString(); bool equal = string.Equals(newValue, Value.ToString(),StringComparison.InvariantCultureIgnoreCase); if(equal) { InvokeActions(args); } } private static void OnBindingChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args) { ((PropertyChangedTrigger)sender).EvaluateBindingChange(args); } } </code></pre> <p>CallMethodAction:</p> <pre><code> public class CallMethodAction : TargetedTriggerAction&lt;FrameworkElement&gt; { private List&lt;MethodDescriptor&gt; methodDescriptors = new List&lt;MethodDescriptor&gt;(); public static readonly DependencyProperty MethodNameProperty = DependencyProperty.Register("MethodName", typeof(string), typeof(CallMethodAction), new PropertyMetadata(new PropertyChangedCallback(OnMethodNameChanged))); public static readonly DependencyProperty TargetObjectProperty = DependencyProperty.Register("TargetObject", typeof(object), typeof(CallMethodAction), new PropertyMetadata(new PropertyChangedCallback(OnTargetObjectChanged))); protected override void OnAttached() { base.OnAttached(); this.UpdateMethodInfo(); } protected override void OnDetaching() { this.methodDescriptors.Clear(); base.OnDetaching(); } private static void OnMethodNameChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args) { ((CallMethodAction)sender).UpdateMethodInfo(); } private static void OnTargetObjectChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args) { ((CallMethodAction)sender).UpdateMethodInfo(); } private static bool AreMethodParamsValid(ParameterInfo[] methodParams) { if (methodParams.Length == 2) { if (methodParams[0].ParameterType != typeof(object)) { return false; } if (!typeof(EventArgs).IsAssignableFrom(methodParams[1].ParameterType)) { return false; } } else if (methodParams.Length != 0) { return false; } return true; } protected override void Invoke(object parameter) { if (base.AssociatedObject != null) { MethodDescriptor descriptor = this.FindBestMethod(parameter); if (descriptor != null) { ParameterInfo[] parameters = descriptor.Parameters; if (parameters.Length == 0) { descriptor.MethodInfo.Invoke(this.Target, null); } else if ((((parameters.Length == 2) &amp;&amp; (base.AssociatedObject != null)) &amp;&amp; ((parameter != null) &amp;&amp; parameters[0].ParameterType.IsAssignableFrom(base.AssociatedObject.GetType()))) &amp;&amp; parameters[1].ParameterType.IsAssignableFrom(parameter.GetType())) { descriptor.MethodInfo.Invoke(this.Target, new object[] { base.AssociatedObject, parameter }); } } else if (this.TargetObject != null) { throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, "No valid method found.", new object[] { this.MethodName, this.TargetObject.GetType().Name })); } } } private MethodDescriptor FindBestMethod(object parameter) { if (parameter != null) { parameter.GetType(); } return this.methodDescriptors.FirstOrDefault(methodDescriptor =&gt; (!methodDescriptor.HasParameters || ((parameter != null) &amp;&amp; methodDescriptor.SecondParameterType.IsAssignableFrom(parameter.GetType())))); } private void UpdateMethodInfo() { this.methodDescriptors.Clear(); if ((this.Target != null) &amp;&amp; !string.IsNullOrEmpty(this.MethodName)) { foreach (MethodInfo info in this.Target.GetType().GetMethods(BindingFlags.Public | BindingFlags.Instance)) { if (this.IsMethodValid(info)) { ParameterInfo[] parameters = info.GetParameters(); if (AreMethodParamsValid(parameters)) { this.methodDescriptors.Add(new MethodDescriptor(info, parameters)); } } } this.methodDescriptors = this.methodDescriptors.OrderByDescending&lt;MethodDescriptor, int&gt;(delegate(MethodDescriptor methodDescriptor) { int num = 0; if (methodDescriptor.HasParameters) { for (Type type = methodDescriptor.SecondParameterType; type != typeof(EventArgs); type = type.BaseType) { num++; } } return (methodDescriptor.ParameterCount + num); }).ToList&lt;MethodDescriptor&gt;(); } } private bool IsMethodValid(MethodInfo method) { if (!string.Equals(method.Name, this.MethodName, StringComparison.Ordinal)) { return false; } if (method.ReturnType != typeof(void)) { return false; } return true; } public void InvokeInternal() { if (AssociatedObject != null) { foreach ( MethodInfo info in AssociatedObject.GetType().GetMethods(BindingFlags.Public | BindingFlags.Instance)) { if (IsMethodValid(info)) { info.Invoke(AssociatedObject, new object[0]); } } } } public string MethodName { get { return (string)base.GetValue(MethodNameProperty); } set { base.SetValue(MethodNameProperty, value); } } private object Target { get { return (TargetObject ?? base.AssociatedObject); } } public object TargetObject { get { return base.GetValue(TargetObjectProperty); } set { base.SetValue(TargetObjectProperty, value); } } private class MethodDescriptor { public MethodDescriptor(MethodInfo methodInfo, ParameterInfo[] methodParams) { MethodInfo = methodInfo; Parameters = methodParams; } public bool HasParameters { get { return (Parameters.Length &gt; 0); } } public MethodInfo MethodInfo { get; private set; } public int ParameterCount { get { return Parameters.Length; } } public ParameterInfo[] Parameters { get; private set; } public Type SecondParameterType { get { if (Parameters.Length &gt;= 2) { return Parameters[1].ParameterType; } return null; } } } } </code></pre> <p>Hope this helps anybode. All questions are welcome! Remeber: all this can be found in the Expression Blend SDK 4. This code is only for people who are forced to work with older versions like 3.5</p> <p>Regards Gope Gope</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload