我正在开发自定义控件,可用于我的应用UI中的互动。所以,我的想法是控件将绑定到具有它的事件的IInteractionsProvider
。然后,我将在此提供程序上调用方法,该方法将向我的控件引发事件以执行它需要执行的操作。
问题是,我不知道如何在自定义控件中正确订阅事件InteractionRequired
。
基本上,我不知道如何正确地挂钩和取消事件,以及在什么时候控制内部。
public interface IInteractionsProvider
{
event EventHandler InteractionRequested;
void RequestInteraction(Action<object> callback);
}
public class MyInteractions : Control
{
public static readonly DependencyProperty ContainerProperty =
DependencyProperty.Register("Container", typeof(Grid), typeof(IdattInteractions), new PropertyMetadata(null));
public static readonly DependencyProperty InteractionsProviderProperty =
DependencyProperty.Register("InteractionsProvider", typeof(IInteractionsProvider), typeof(IdattInteractions), new PropertyMetadata(null));
public IdattInteractions()
{
DefaultStyleKey = typeof(MyInteractions);
}
public Grid Container
{
get { return GetValue(ContainerProperty) as Grid; }
set { this.SetValue(ContainerProperty, value); }
}
public IInteractionsProvider InteractionsProvider
{
get { return (IInteractionsProvider)GetValue(InteractionsProviderProperty); }
set { this.SetValue(InteractionsProviderProperty, value); }
}
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
if (System.ComponentModel.DesignerProperties.IsInDesignTool) return;
if (this.InteractionsProvider == null)
{
throw new NotSupportedException("InteractionsProvider wasn't specified. If you don't need interactions on this view - please remove MyInteractions from XAML");
}
if (this.Container != null)
{
if (this.Container.GetType() != typeof(Grid))
{
throw new NotSupportedException("Specified container must be of Grid type");
}
}
else
{
this.Container = TreeHelper.FindParentGridByName(this, "LayoutRoot") ?? TreeHelper.FindParent<Grid>(this);
if (this.Container == null)
{
throw new NotSupportedException("Container wasn't specified and parent Grid wasn't found");
}
}
}
}
答案 0 :(得分:1)
要附加依赖项属性上的事件(或者在分配了依赖项属性时执行任何操作,可以使用PropertyMetadata
上的回调委托。
public static readonly DependencyProperty InteractionsProviderProperty =
DependencyProperty.Register("InteractionsProvider", typeof(IInteractionsProvider), typeof(IdattInteractions), new PropertyMetadata(null, OnInteractionsProviderPropertyChanged));
private static void OnInteractionsProviderPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var source = d As MyInteractions;
if (source ! = null)
{
var oldValue = (IInteractionsProvider)e.OldValue;
var newValue = (IInteractionsProvider)e.NewValue;
source.OnInteractionsProviderPropertyChanged(oldValue, newValue);
}
}
private void OnInteractionsProviderPropertyChanged(IInteractionsProvider oldValue, IInteractionsProvider newValue)
{
if (oldValue != null)
oldValue -= InteractionsProvider_InteractionRequested;
if (newValue != null)
newValue += InteractionsProvider_InteractionRequested;
}
private void InteractionsProvider_InteractionRequested(object sender, EventArgs e)
{
// Do Stuff
}
答案 1 :(得分:0)
这是你在找什么?
public IInteractionsProvider InteractionsProvider
{
get { return (IInteractionsProvider)GetValue(InteractionsProviderProperty); }
set {
var oldValue = this.InteractionsProvider;
if (oldValue != null)
oldValue.InteractionRequested -= this.HandleInteractionRequested;
if (value != null)
value.InteractionRequested += this.HandleInteractionRequested;
this.SetValue(InteractionsProviderProperty, value);
}
}
private void HandleInteractionRequested(object sender, EventArgs e)
{
//...
}