Параметры помощника Julmar WPF - PullRequest
0 голосов
/ 27 июня 2009

Я использую вспомогательные классы Julmar для WPF, чтобы я мог вызывать пользовательскую ICommand для события, такого как MouseEnter, в текстовом поле, например так:

<TextBox Text="hmm">
    <julmar:EventCommander.Mappings>    
        <julmar:CommandEvent Command="{Binding DataContext.IncreaseQueueTimeCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}" Event="MouseEnter" />
    </julmar:EventCommander.Mappings>
</TextBox>

Это работает и вызывает команду, проблема в том, что мне нужно передать объект в качестве параметра, кто-нибудь знает, возможно ли это? документация кажется довольно легкой.

Ранее я мог передать объект в качестве параметра, подобного этому:

<Button Content="Save" x:Name="SaveQueueTimeButton" Command="{Binding DataContext.SaveQueueTimeCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}" CommandParameter="{Binding}" />

Но, очевидно, это не то, что мне нужно, поскольку он не срабатывает на MouseEvent

Любая помощь будет полезна,

Спасибо

Ответы [ 2 ]

1 голос
/ 27 июня 2009

Вы можете решить это с помощью модели поведения. По сути, вы создаете пользовательский класс с двумя свойствами зависимостей: Command и CommandParameter. Вы также регистрируете обработчик для обоих свойств.

В одном из обработчиков вы передаете свой TextBox в качестве параметра. Теперь вы можете подключиться к интересующим вас событиям. Если теперь вызывается один из зарегистрированных обработчиков событий, вы можете вызвать связанную команду с параметром связанной команды.

Вот пример кода:

public class CommandHelper
{
    //
    // Attached Properties
    //
    public static ICommand GetCommand(DependencyObject obj)
    {
        return (ICommand)obj.GetValue(CommandProperty);
    }

    public static void SetCommand(DependencyObject obj, ICommand value)
    {
        obj.SetValue(CommandProperty, value);
    }

    public static readonly DependencyProperty CommandProperty =
        DependencyProperty.RegisterAttached("Command", typeof(ICommand), typeof(CommandHelper), new UIPropertyMetadata(null));



    public static object GetCommandParameter(DependencyObject obj)
    {
        return (object)obj.GetValue(CommandParameterProperty);
    }

    public static void SetCommandParameter(DependencyObject obj, object value)
    {
        obj.SetValue(CommandParameterProperty, value);
    }

    public static readonly DependencyProperty CommandParameterProperty =
        DependencyProperty.RegisterAttached("CommandParameter", typeof(object), typeof(CommandHelper), new UIPropertyMetadata(null));


    //
    // This property is basically only there to attach handlers to the control that will be the command source
    //
    public static bool GetIsCommandSource(DependencyObject obj)
    {
        return (bool)obj.GetValue(IsCommandSourceProperty);
    }

    public static void SetIsCommandSource(DependencyObject obj, bool value)
    {
        obj.SetValue(IsCommandSourceProperty, value);
    }

    public static readonly DependencyProperty IsCommandSourceProperty =
        DependencyProperty.RegisterAttached("IsCommandSource", typeof(bool), typeof(CommandHelper), new UIPropertyMetadata(false, OnRegisterHandler));


    //
    // Here you can register handlers for the events, where you want to invoke your command
    //
    private static void OnRegisterHandler(DependencyObject obj, DependencyPropertyChangedEventArgs e)
    {
        FrameworkElement source = obj as FrameworkElement;

        source.MouseEnter += OnMouseEnter;
    }

    private static void OnMouseEnter(object sender, MouseEventArgs e)
    {
        DependencyObject source = sender as DependencyObject;
        ICommand command = GetCommand(source);
        object commandParameter = GetCommandParameter(source);

        // Invoke the command
        if (command.CanExecute(commandParameter))
            command.Execute(commandParameter);
    }
}

И Xaml:

  <TextBox Text="My Command Source"
             local:CommandHelper.IsCommandSource="true"
             local:CommandHelper.Command="{Binding MyCommand}"
             local:CommandHelper.CommandParameter="MyParameter" />
0 голосов
/ 29 июня 2009

Если Julmar CommandEvent не имеет свойства CommandParameter, я предлагаю вам вместо этого использовать Attached Command Behaviors Марлона Греча. Это очень похоже, но предоставляет свойство CommandParameter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...