1

XAMLでEventHandlerを定義する際に問題が発生しました。コードを見てください。私がやろうとしていることと、XAMLでメソッドを割り当てようとしている方法、またはXAMLでEventHandlerを定義している方法を理解できます。

これはコードです:

public static EventHandler<EventArgs> GetResetValue(DependencyObject obj)
{ 
   return (EventHandler<EventArgs>)obj.GetValue(ResetValueProperty);
}

public static void SetResetValue(DependencyObject obj, EventHandler<EventArgs> value)
{
    obj.SetValue(ResetValueProperty, value);
}

// Using a DependencyProperty as the backing store for ResetValue.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty ResetValueProperty =
    DependencyProperty.RegisterAttached("ResetValue", typeof(EventHandler<EventArgs>), typeof(Extension), new UIPropertyMetadata(null, OnResetValue));

private static void OnResetValue(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
{
    DependencyObject obj = dependencyObject;
    for (; obj != null && !(obj is TextBox); obj = VisualTreeHelper.GetParent(obj)) ;

    TextBoxtbx = obj as TextBox;
    if (tbx != null)
    {
        tbx.TextChanged += (EventHandler<EventArgs>)dependencyPropertyChangedEventArgs.NewValue;
    }
}

XAMLは次のようになります。

<TextBox>
 <Button>
  <Label ext:Extension.ResetValue=".. here i want to assign the handler, as examle DoSomething" >
 </Button>
</TextBox>

アタッチされたハンドラーに割り当てたいメソッドは、Window.cs内にあります。例として次のようになります。

public void DoSomething(object sender, EventArgs e)
{
  ....
}

OnResetValueメソッドでわかるように、TextBoxが見つかるまでVisualTreeを上に移動し、TextBox.TextChangedイベントにハンドラーを追加します。

TextChangedの場合、アタッチされたハンドラーメソッドが呼び出され、割り当てられたメソッドが呼び出されます。

問題は、DoSomethingメソッドを使用してXAMLでアタッチされたハンドラーをどのように定義するかです。代替の解決策はありません。できればイベントでやりたいです。

4

1 に答える 1

0

イベント ハンドラーをアタッチするために通常の XAML メカニズムを使用しようとしているようです。

<Button Click="OnButtonClick"/>

しかし、あなたの場合、割り当てようとしているのはイベントではなく、たまたま EventHandler デリゲートである型を持つ通常のプロパティです。これは、ResetValue のタイプを代わりに使用するように変更した場合、より明確になる可能性がありますAction<object, EventArgs>。これは機能的に同じです。

ResetValue プロパティに割り当てることができるフォームでハンドラー メソッドを公開するには、次のようにします。

public EventHandler<EventArgs> DoSomethingMethod
{
    get { return new EventHandler<EventArgs>(DoSomething); }
}

設定する DP のタイプに一致するプロパティを取得したので、通常のバインディングを使用できます。

<Label ext:Extension.ResetValue="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}, Path=DoSomethingMethod}" >
于 2013-03-14T14:08:36.490 に答える